在特定 XML 节点 C# 之后添加同级
Add sibling after a specific XML node C#
我的 xml 文档如下所示:
<root>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent2>
<element1>
</element1>
</parent2>
<parent2>
<element1>
</element1>
</parent2>
<parent3>
<element2>
</element2>
</parent3>
</root>
我想在第一个 parent2 节点之前的最后一个 parent1 节点之后添加一个新的 parent1 节点。
像这样:
<root>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent2>
<element1>
</element1>
</parent2>
<parent2>
<element1>
</element1>
</parent2>
<parent3>
<element2>
</element2>
</parent3>
</root>
我尝试使用 XmlDocument SelectSingleNode 和 AppendChild 方法,但它只在最后一个 parent3 节点之后添加新的子节点。
编辑:
我试过这个代码:
string newNode = "<parent1/><element1>1</element1></parent1/>";
XmlDocumentFragment xmlDocFrag = xmlDocument.CreateDocumentFragment();
xmlDocFrag.InnerXml = newNode;
XmlElement element = (XmlElement)xmlDocument.SelectSingleNode(@"//root/parent1[last()]");
element.InsertAfter(xmlDocFrag, element); //--> this throws an error
element.AppendChild(xmlDocFrag); //--> this works but it inserts the new node inside the last parent1 node
你已经很接近了,但你需要的方法是 InsertAfter
,它必须在父级上使用。看看这个例子(注释在代码中)
string xml = @"
<root>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent2>
<element1>
</element1>
</parent2>
<parent2>
<element1>
</element1>
</parent2>
<parent3>
<element2>
</element2>
</parent3>
</root>
";
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
//you had invalid xml here. <parent1/> instead of <parent1> and </parent1/> instead of </parent1>
string newNode = "<parent1><element1>1</element1></parent1>";
XmlDocumentFragment xmlDocFrag = xmlDocument.CreateDocumentFragment();
xmlDocFrag.InnerXml = newNode;
XmlElement element = (XmlElement)xmlDocument.SelectSingleNode(@"//root/parent1[last()]");
//once you found last parent1 element, find it's parent
XmlNode parent = element.ParentNode;
//now, use that parent element and it's InsertAfter method to add new node as sibling to your found element
parent.InsertAfter(xmlDocFrag, element);
我的 xml 文档如下所示:
<root>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent2>
<element1>
</element1>
</parent2>
<parent2>
<element1>
</element1>
</parent2>
<parent3>
<element2>
</element2>
</parent3>
</root>
我想在第一个 parent2 节点之前的最后一个 parent1 节点之后添加一个新的 parent1 节点。
像这样:
<root>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent2>
<element1>
</element1>
</parent2>
<parent2>
<element1>
</element1>
</parent2>
<parent3>
<element2>
</element2>
</parent3>
</root>
我尝试使用 XmlDocument SelectSingleNode 和 AppendChild 方法,但它只在最后一个 parent3 节点之后添加新的子节点。
编辑:
我试过这个代码:
string newNode = "<parent1/><element1>1</element1></parent1/>";
XmlDocumentFragment xmlDocFrag = xmlDocument.CreateDocumentFragment();
xmlDocFrag.InnerXml = newNode;
XmlElement element = (XmlElement)xmlDocument.SelectSingleNode(@"//root/parent1[last()]");
element.InsertAfter(xmlDocFrag, element); //--> this throws an error
element.AppendChild(xmlDocFrag); //--> this works but it inserts the new node inside the last parent1 node
你已经很接近了,但你需要的方法是 InsertAfter
,它必须在父级上使用。看看这个例子(注释在代码中)
string xml = @"
<root>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent1>
<element1>
</element1>
</parent1>
<parent2>
<element1>
</element1>
</parent2>
<parent2>
<element1>
</element1>
</parent2>
<parent3>
<element2>
</element2>
</parent3>
</root>
";
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
//you had invalid xml here. <parent1/> instead of <parent1> and </parent1/> instead of </parent1>
string newNode = "<parent1><element1>1</element1></parent1>";
XmlDocumentFragment xmlDocFrag = xmlDocument.CreateDocumentFragment();
xmlDocFrag.InnerXml = newNode;
XmlElement element = (XmlElement)xmlDocument.SelectSingleNode(@"//root/parent1[last()]");
//once you found last parent1 element, find it's parent
XmlNode parent = element.ParentNode;
//now, use that parent element and it's InsertAfter method to add new node as sibling to your found element
parent.InsertAfter(xmlDocFrag, element);