使用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;然后如果它有子节点,则递归调用直到找到目标节点。
答案 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()
将尝试在所有分支中查找匹配的节点。