当path是可变的时,通过LINQ添加新的XML元素

时间:2014-09-16 07:26:35

标签: c# xml linq

使用XElement / LINQ添加新元素时遇到一些问题,当路径未知时,也是LINQ的新手。在C#中,Winforms

修改:' ID' xml中的值实际上是GUID,只是为了便于阅读而在这里修剪。

例如,如果我有以下xml文件:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Structure>
    <Nodes>
      <Node ID="1" Name="A" />
      <Node ID="2" Name="B" />
      <Node ID="3" Name="C" >
        <Nodes>
          <Node ID="4" Name="D" />
          <Node ID="5" Name="E" >
            <Nodes>
              <Node ID="6" Name="F" />
            </Nodes>
          </Node>
        </Nodes>
      </Node>
    </Nodes>
  </Structure>
</Root>

然后我在节点2 / B下面插入新节点(ID = 7 Name = G)的代码片段是: (注意:我之前确定了目标,在这种情况下为2,为了简洁而硬编码)

// Add Node:
_XML_Modify.Element("Structure")
.Elements("Nodes")
.Elements("Node")
.Where(item => item.Attribute("ID").Value == 2).FirstOrDefault()
.AddAfterSelf(new XElement("Node",
new XAttribute("ID", 7),
new XAttribute("Name", "G")
));

但是,如果我不确定目标,我该如何添加新节点?例如,如果要在节点4 / D或6 / F下面添加新节点,其中路径与上面的路径不同。

在这种情况下,最好使用递归来查找我的目标节点吗?我已经尝试了这一点并且稍微挣扎了,但我正在考虑做一个&#34; Find&#34;然后如果它有子节点,则递归调用直到找到目标节点。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以使用Descendants()在不知道节点的确切路径的情况下查找节点。例如,要在具有ID=6的节点之后添加新节点:

_XML_Modify.Descendants("Node")
           .FirstOrDefault(o => (int)o.Attribute("ID") == 6)
           .AddAfterSelf(new XElement("Node",
                            new XAttribute("ID", 7),
                            new XAttribute("Name", "G")
                            ));

请注意,与使用更具体的路径相比,此方法可能更慢,尤其是在给定大型XML文档的情况下,因为Descendants()将尝试在所有分支中查找匹配的节点。