C# 当path可变时,通过LINQ添加新的XML元素
当路径未知时,使用XElement/LINQ添加新元素有点问题,我对LINQ也相当陌生。在C#中,Winforms 编辑:xml中的“ID”值实际上是GUID,只是为了便于阅读而在这里进行了裁剪 例如,如果我有以下xml文件:C# 当path可变时,通过LINQ添加新的XML元素,c#,xml,linq,C#,Xml,Linq,当路径未知时,使用XElement/LINQ添加新元素有点问题,我对LINQ也相当陌生。在C#中,Winforms 编辑:xml中的“ID”值实际上是GUID,只是为了便于阅读而在这里进行了裁剪 例如,如果我有以下xml文件: <?xml version="1.0" encoding="utf-8"?> <Root> <Structure> <Nodes> <Node ID="1" Name="A" />
<?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>
但是,如果我不确定目标,如何添加新节点?例如,如果要在路径不同的节点4/D或6/F下添加新节点,请执行上述操作
在这种情况下,最好使用递归来查找目标节点吗?我已经试过了,也有点挣扎,但我想做一个“查找”,如果它有子节点,则递归调用,直到找到目标节点。如果我理解正确,您可以使用
子体()
查找节点,而不必知道节点的确切路径。例如,要在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文档中,因为
子体()
将尝试在所有分支中查找匹配的节点。您的ID
属性是否具有唯一值?是。xml中的“ID”值实际上是GUID,只是为了便于阅读而进行了精简。我已经编辑了您的标题。请参阅“”,其中的共识是“不,他们不应该”。谢谢,基于对一个小xml文件的测试,这非常有效。将看到当试图操作大得多的文件时的性能。当然,下一步就是把它们也移除。
_XML_Modify.Descendants("Node")
.FirstOrDefault(o => (int)o.Attribute("ID") == 6)
.AddAfterSelf(new XElement("Node",
new XAttribute("ID", 7),
new XAttribute("Name", "G")
));