如何修改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()); } }
关键改动说明
- 移除了提前创建的单个
xmlFinalRoot节点,改为在每次循环内创建新的Root节点,确保每组Person和City都被独立包裹 - 用
List<XElement>收集所有生成的Root节点,统一处理输出 - 最后通过
StreamWriter逐个写入每个Root的XML字符串,实现多Root节点的输出效果
注意:这种多Root节点的输出不符合标准XML规范(标准XML要求文档必须有且仅有一个根节点),如果后续需要用XML解析器处理该文件,可能会报错。若要符合规范,可以在外层增加一个总根节点(如
<Roots>)来包含所有<Root>子节点。
内容的提问来源于stack exchange,提问作者gggpp
相关产品推荐
相关产品推荐

