You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#类序列化XML时无法插入命名空间属性的问题求助

解决方案

要在<Document>元素上生成指定的命名空间属性和xsi:type,你之前的特性用法有误,以下是正确的实现方式:

1. 修正Document类的特性定义

xmlns属性属于xmlns自身的标准命名空间(http://www.w3.org/2000/xmlns/),而xsi:type需要关联你指定的www.test.com命名空间,调整后的Document类代码如下:

public class Document
{
    // 声明xsi前缀对应的命名空间,属性名是"xsi",归属xmlns标准命名空间
    [XmlAttribute("xsi", Namespace = "http://www.w3.org/2000/xmlns/")]
    public string XsiNamespace = "www.test.com";

    // 定义xsi:type属性,属性名是"type",归属上面声明的www.test.com命名空间
    [XmlAttribute("type", Namespace = "www.test.com")]
    public string XsiType = "somename";

    public string Name { get; set; }
    public string DOB { get; set; }
}

2. 定义包含Documents的父类

对应你期望的XML结构,根节点类可以这样定义:

public class Root
{
    // 处理重复的someOtherElement元素
    [XmlElement("someOtherElement")]
    public List<string> SomeOtherElements { get; set; } = new List<string>();

    public List<Document> Documents { get; set; } = new List<Document>();
}

3. 执行序列化

使用XmlSerializer完成序列化的代码示例:

var root = new Root
{
    SomeOtherElements = { "", "", "", "" }, // 对应四个空的someOtherElement节点
    Documents = { new Document { Name = "", DOB = "" } }
};

var serializer = new XmlSerializer(typeof(Root));
using (var writer = new StreamWriter("output.xml"))
{
    serializer.Serialize(writer, root);
}

为什么之前的写法不生效?

你之前直接用[XmlAttribute("xmlns:xsi", Namespace = "www.test.com")]是错误的:

  • xmlns属性是特殊的命名空间声明,必须归属http://www.w3.org/2000/xmlns/命名空间,不能直接指定属性名为xmlns:xsi;
  • xsi:type的属性名应为type,并关联到www.test.com命名空间,序列化时会自动带上xsi前缀(因为我们已经声明了前缀对应关系)。

内容的提问来源于stack exchange,提问作者twozedz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:09:24