Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当path可变时,通过LINQ添加新的XML元素_C#_Xml_Linq - Fatal编程技术网

C# 当path可变时,通过LINQ添加新的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" />

当路径未知时,使用XElement/LINQ添加新元素有点问题,我对LINQ也相当陌生。在C#中,Winforms

编辑:xml中的“ID”值实际上是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>
但是,如果我不确定目标,如何添加新节点?例如,如果要在路径不同的节点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")
                            ));