修改xml以将子节点合并到单个节点

时间:2018-05-16 00:05:51

标签: c# xml linq linq-to-xml

我将XML作为服务的响应。

var Response = httpService.GetResponse();
XDocument doc = XDocument.Parse(Response);

xml看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
  <Parent>
    <ChildType1>contentA</ChildType1>
    <ChildType2>contentB</ChildType2>
    <ChildType3>contentC</ChildType3>
  </Parent>
  <Parent>
    <ChildType1>contentD</ChildType1>
    <ChildType3>contentE</ChildType3>
  </Parent>
</edmx:Edmx>

如何编辑它,看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
  <Parent>
    <ChildType1>contentA</ChildType1>
    <ChildType2>contentB</ChildType2>
    <ChildType3>contentC</ChildType3>
    <ChildType1>contentD</ChildType1>
    <ChildType3>contentE</ChildType3>
  </Parent>
</edmx:Edmx>

2 个答案:

答案 0 :(得分:0)

一旦你理解了如何玩XDocument,XElement就很简单了。 我刚刚创建了一个List<XElement>来收集所有子元素,然后我只是将它们附加到一个新的父级并将父级分配给根。

我强烈建议您创建一个新文档,而不是更新现有文档。

解决方案1:详细版本,了解其工作原理。

XDocument xDoc = XDocument.Parse(str);
List<XElement> allChildNodes = new List<XElement>();
foreach (var parent in xDoc.Root.Elements("Parent"))
{
    allChildNodes.AddRange(parent.Descendants());
}
XElement xParent = new XElement("Parent");
xParent.Add(allChildNodes);
xDoc.Root.Descendants().Remove();
xDoc.Root.Add(xParent);

解决方案2:感谢Jeff Mercado,我们有一个紧凑版本。

XDocument xDoc = XDocument.Parse(str);
xDoc.Root.ReplaceNodes(
    new XElement("Parent", // New parent element is created
    xDoc.Root.Elements("Parent").Elements()));

<强>输出:

<root>
  <Parent>
    <ChildType1>contentA</ChildType1>
    <ChildType2>contentB</ChildType2>
    <ChildType3>contentC</ChildType3>
    <ChildType1>contentD</ChildType1>
    <ChildType3>contentE</ChildType3>
  </Parent>
</root>

答案 1 :(得分:0)

要替换Parent节点,可以使用XElement.ReplaceNodes()替换根节点的子节点。将这些节点替换为包含已替换节点子节点的新Parent节点。

doc.Root.ReplaceNodes(
    new XElement("Parent",
        doc.Root.Elements("Parent").Elements()
    )
);