XML序列化父/子元素命名空间配置问题:重复父元素解决求助
XML序列化重复父元素问题排查及修复
问题说明
XML序列化时配置命名空间后,生成的XML出现嵌套重复的parentElement,期望仅保留一个parentElement,并正确嵌套childElement及其子元素。
示例代码
using System; using System.IO; using System.Xml.Serialization; namespace XmlSerializationExample { class Program { static void Main(string[] args) { var grandchild = new grandchild_element { Value = "randomResults" }; var child = new child_element { grandchildElement = grandchild }; var parent = new parent_element { childElement = child }; var serializer = new XmlSerializer(typeof(parent_element), "www.testing.com"); var namespaces = new XmlSerializerNamespaces(new[] { new XmlQualifiedName("xsi", "http://www.w3.org/2001/XMLSchema-instance") }); var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Indent = true, Encoding = System.Text.Encoding.UTF8 }; string xmlOutPut = @"C:\Users\[user]\Desktop\xml_test_file_" + DateTime.Now.ToString("HHmmss") + ".xml"; using (var fileStream = new FileStream(xmlOutPut, FileMode.Create)) using (var xmlWriter = XmlWriter.Create(fileStream, settings)) { xmlWriter.WriteStartElement("parentElement", "www.testing.com"); serializer.Serialize(xmlWriter, parent, namespaces); xmlWriter.WriteEndElement(); } } } [XmlRoot(ElementName = "parentElement", Namespace = "www.testing.com")] public class parent_element { public child_element childElement { get; set; } } public class child_element { [XmlElement(ElementName = "grandchildElement")] public grandchild_element grandchildElement { get; set; } [XmlAttribute(AttributeName = "xsi", Namespace = "http://www.w3.org/2000/xmlns/")] public string xsi = "http://www.w3.org/2001/XMLSchema-instance"; [XmlAttribute(AttributeName = "type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")] public string type = "text_type"; } public class grandchild_element { [XmlText] public string Value { get; set; } } }
当前输出
<parentElement xmlns="www.testing.com"> <parentElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <childElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="text_type"> <grandchildElement>randomResults</grandchildElement> </childElement> </parentElement> </parentElement>
期望输出
<parentElement xmlns="www.testing.com"> <childElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="text_type"> <grandchildElement>randomResults</grandchildElement> </childElement> </parentElement>
修复方案
1. 核心问题定位
重复的parentElement是因为手动调用xmlWriter.WriteStartElement/WriteEndElement生成了一个父元素,同时XmlSerializer.Serialize会自动序列化parent_element类对应的父元素,导致嵌套重复。
2. 修复步骤
步骤1:移除手动写入的父元素标签
删除代码中手动创建parentElement的两行代码,让序列化器完整输出整个结构:
// 移除以下两行 xmlWriter.WriteStartElement("parentElement", "www.testing.com"); xmlWriter.WriteEndElement();
步骤2:优化命名空间配置
移除child_element类中手动定义的xsi命名空间属性,避免重复声明。如果需要让xsi命名空间仅出现在childElement上,可通过XmlNamespaceDeclarations属性在child_element类中单独声明:
public class child_element { [XmlElement(ElementName = "grandchildElement")] public grandchild_element grandchildElement { get; set; } [XmlNamespaceDeclarations] public XmlSerializerNamespaces Namespaces = new XmlSerializerNamespaces(new[] { new XmlQualifiedName("xsi", "http://www.w3.org/2001/XMLSchema-instance") }); [XmlAttribute(AttributeName = "type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")] public string type = "text_type"; }
同时序列化时不传递全局的namespaces参数,确保xsi命名空间仅出现在childElement标签上。
修复后完整代码
using System; using System.IO; using System.Xml.Serialization; namespace XmlSerializationExample { class Program { static void Main(string[] args) { var grandchild = new grandchild_element { Value = "randomResults" }; var child = new child_element { grandchildElement = grandchild }; var parent = new parent_element { childElement = child }; var serializer = new XmlSerializer(typeof(parent_element), "www.testing.com"); var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Indent = true, Encoding = System.Text.Encoding.UTF8 }; string xmlOutPut = @"C:\Users\[user]\Desktop\xml_test_file_" + DateTime.Now.ToString("HHmmss") + ".xml"; using (var fileStream = new FileStream(xmlOutPut, FileMode.Create)) using (var xmlWriter = XmlWriter.Create(fileStream, settings)) { serializer.Serialize(xmlWriter, parent); } } } [XmlRoot(ElementName = "parentElement", Namespace = "www.testing.com")] public class parent_element { public child_element childElement { get; set; } } public class child_element { [XmlElement(ElementName = "grandchildElement")] public grandchild_element grandchildElement { get; set; } [XmlNamespaceDeclarations] public XmlSerializerNamespaces Namespaces = new XmlSerializerNamespaces(new[] { new XmlQualifiedName("xsi", "http://www.w3.org/2001/XMLSchema-instance") }); [XmlAttribute(AttributeName = "type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")] public string type = "text_type"; } public class grandchild_element { [XmlText] public string Value { get; set; } } }
修复后输出
<parentElement xmlns="www.testing.com"> <childElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="text_type"> <grandchildElement>randomResults</grandchildElement> </childElement> </parentElement>
内容的提问来源于stack exchange,提问作者learning
相关产品推荐
相关产品推荐

