Добавить брата после определенного узла XML C #

geri222 спросил: 31 июля 2018 в 09:45 в: 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>

Я хочу добавить новый родительский узел после последнего родительского узла до первого родительского узла.

Пример:

<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, но он только добавляет новый дочерний элемент после последнего родительского узла.

EDIT:

Я пробовал с этим кодом:

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

1 ответ

Есть решение
Nino ответил: 31 июля 2018 в 10:20

вы были довольно близки, но вам нужен метод 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);
geri222 ответил: 31 июля 2018 в 10:27
Спасибо! Работает!