在特定的XML节点C#之后添加同级 [英] Add sibling after a specific XML node C#

查看:85
本文介绍了在特定的XML节点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节点。 / p>

就像这样:

 < 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元素=(XmlElement)xmlDocument.SelectSingleNode(@ // root / parent1 [last()]);


元素。InsertAfter(xmlDocFrag,元素); //->这将引发错误
element.AppendChild(xmlDocFrag); //->此方法有效,但它将新节点插入到最后一个parent1节点内


解决方案

您非常接近,但是您需要的方法是 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);

//您的XML无效。 < parent1 />代替< parent1>和< / parent1 />代替< / parent1>
string newNode =< parent1>< element1> 1< / element1>< / parent1>;

XmlDocumentFragment xmlDocFrag = xmlDocument.CreateDocumentFragment();
xmlDocFrag.InnerXml = newNode;

XmlElement元素=(XmlElement)xmlDocument.SelectSingleNode(@ // root / parent1 [last()]);

//找到最后一个parent1元素后,找到它的父元素
XmlNode parent = element.ParentNode;
//现在,使用该父元素及其InsertAfter方法将新节点作为同级添加到找到的元素
parent.InsertAfter(xmlDocFrag,element);中。


My xml document looks like this:

<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>

I would like to add a new parent1 node after the last parent1 node before the first parent2 node.

Like this:

<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>

I tried with the XmlDocument SelectSingleNode and AppendChild methods but it only adds the new child after the last parent3 node.

EDIT:

I tried with this code:

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

解决方案

you were pretty close, but the method you needed is InsertAfter which has to be used on parent. Take a look at this example (comments are in code)

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节点C#之后添加同级的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆