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

如何动态生成含单个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:22:07