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
相关产品推荐
相关产品推荐

