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

如何修改XElement循环代码生成多Root节点的XML文件

问题:将每组Person和City包裹在独立的Root节点中

我有两个XDocument,已转换为XElement,需要筛选元素并合并。当前用foreach循环实现,但生成的XML是单Root节点下包含多组Person和City,希望修改代码让每组Person和City都被独立的Root节点包裹。

原代码

var xelPerson = xDocument1.Root;
var xelCity = XDocument2.Root;

XElement xmlFinal = new XElement("Root");

foreach (var rowXel2 in xelCity.Elements("City"))
{
    var idPersonCity = rowXel2.Element("idPerson").Value;

    XElement rowPerson = xelPerson.Elements("Person")
        .FirstOrDefault(r => r.Element("idPerson").Value == idPersonCity);

    xmlFinal.Add(rowPratica);
    xmlFinal.Add(rowXML);
}
xmlFinal.Save(@"c:\temp\final.xml");

当前生成的XML

<Root>
  <Person>
   <idPerson>1</idPerson>
   <name>Luke</name>
  </Person>
  <City>
    <idPerson>1</idPerson>
    <cityPerson>London</cityPeson>
  </City>
  <Person>
    <idPerson>2</idPerson>
    <name>Maria</name>
  </Person>
  <City>
    <idPerson>2</idPerson>
    <cityPerson>Paris</cityPeson>
  </City>
</Root>

期望生成的XML

<Root>
  <Person>
   <idPerson>1</idPerson>
   <name>Luke</name>
  </Person>
  <City>
    <idPerson>1</idPerson>
    <cityPerson>London</cityPeson>
  </City>
</Root>
<Root>
  <Person>
    <idPerson>2</idPerson>
    <name>Maria</name>
  </Person>
  <City>
    <idPerson>2</idPerson>
    <cityPerson>Paris</cityPeson>
  </City>
</Root>

修改后的代码

var xelPerson = xDocument1.Root;
var xelCity = XDocument2.Root;

// 收集所有独立的Root节点
List<XElement> rootElements = new List<XElement>();

foreach (var rowCity in xelCity.Elements("City"))
{
    var idPersonCity = rowCity.Element("idPerson").Value;

    XElement rowPerson = xelPerson.Elements("Person")
        .FirstOrDefault(r => r.Element("idPerson").Value == idPersonCity);

    // 每次循环创建新的Root节点,包裹当前组的Person和City
    XElement currentRoot = new XElement("Root");
    if (rowPerson != null)
    {
        currentRoot.Add(rowPerson);
    }
    currentRoot.Add(rowCity);
    
    rootElements.Add(currentRoot);
}

// 写入文件,由于多Root不符合XML单根规范,直接输出每个Root的文本
using (StreamWriter writer = new StreamWriter(@"c:\temp\final.xml"))
{
    foreach (var root in rootElements)
    {
        writer.WriteLine(root.ToString());
    }
}

关键改动说明

  • 移除了提前创建的单个xmlFinal Root节点,改为在每次循环内创建新的Root节点,确保每组Person和City都被独立包裹
  • 用List<XElement>收集所有生成的Root节点,统一处理输出
  • 最后通过StreamWriter逐个写入每个Root的XML字符串,实现多Root节点的输出效果

注意:这种多Root节点的输出不符合标准XML规范(标准XML要求文档必须有且仅有一个根节点),如果后续需要用XML解析器处理该文件,可能会报错。若要符合规范,可以在外层增加一个总根节点(如<Roots>)来包含所有<Root>子节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:07:46