如何动态生成含单个root节点且cde与fgh的id1匹配的XML?
解决方案
问题根源
你当前的问题是因为直接序列化了Root类型的集合,或者DTO模型的XML特性配置错误,导致XmlSerializer自动生成ArrayOfRoots作为根节点,且每个元素都是独立的root节点。要生成单个root节点包含多个<cde>和<fgh>,需要调整DTO模型设计和序列化方式。
正确的DTO模型设计
定义包含集合属性的根节点类,通过XML特性控制序列化后的节点结构:
using System.Collections.Generic; using System.Xml.Serialization; // 指定根节点名称为root [XmlRoot("root")] public class Root { // 配置XmlElement,让集合直接生成多个<cde>节点,避免嵌套容器 [XmlElement("cde")] public List<Cde> CdeItems { get; set; } = new List<Cde>(); [XmlElement("fgh")] public List<Fgh> FghItems { get; set; } = new List<Fgh>(); } public class Cde { [XmlAttribute("id1")] public string Id1 { get; set; } // 可添加cde节点的其他属性或子节点 public string Content { get; set; } } public class Fgh { [XmlAttribute("id1")] public string Id1 { get; set; } // 可添加fgh节点的其他属性或子节点 public string Content { get; set; } }
序列化代码示例
创建单个Root实例,填充匹配id1的节点后直接序列化该实例:
using System.IO; using System.Xml.Serialization; // 初始化根节点 var root = new Root(); // 循环生成id1匹配的cde和fgh节点 for (int i = 1; i <= 3; i++) { var targetId = $"ITEM_{i}"; root.CdeItems.Add(new Cde { Id1 = targetId, Content = $"CDE数据{i}" }); root.FghItems.Add(new Fgh { Id1 = targetId, Content = $"FGH数据{i}" }); } // 执行序列化 var serializer = new XmlSerializer(typeof(Root)); using var writer = new StringWriter(); serializer.Serialize(writer, root); // 输出结果 string xmlOutput = writer.ToString(); Console.WriteLine(xmlOutput);
生成的XML结构示例
最终会生成符合需求的XML,结构如下:
<?xml version="1.0" encoding="utf-16"?> <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <cde id1="ITEM_1"> <Content>CDE数据1</Content> </cde> <cde id1="ITEM_2"> <Content>CDE数据2</Content> </cde> <cde id1="ITEM_3"> <Content>CDE数据3</Content> </cde> <fgh id1="ITEM_1"> <Content>FGH数据1</Content> </fgh> <fgh id1="ITEM_2"> <Content>FGH数据2</Content> </fgh> <fgh id1="ITEM_3"> <Content>FGH数据3</Content> </fgh> </root>
关键注意事项
- 必须序列化单个
Root实例,而非List<Root>,否则会生成ArrayOfRoots根节点。 - 集合属性需添加
[XmlElement("节点名称")]特性,确保集合元素直接作为根节点的子节点,不生成嵌套容器。 - 循环生成节点时统一赋值
id1,保证<cde>和对应<fgh>的属性值匹配。
内容的提问来源于stack exchange,提问作者gggpp
相关产品推荐
相关产品推荐

