Изменить XML для объединения дочерних узлов в один узел - PullRequest
0 голосов
/ 16 мая 2018

У меня есть XML как ответ от службы.

var Response = httpService.GetResponse();
XDocument doc = XDocument.Parse(Response);

XML выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
  <Parent>
    <ChildType1>contentA</ChildType1>
    <ChildType2>contentB</ChildType2>
    <ChildType3>contentC</ChildType3>
  </Parent>
  <Parent>
    <ChildType1>contentD</ChildType1>
    <ChildType3>contentE</ChildType3>
  </Parent>
</edmx:Edmx>

Как мне отредактировать это так, чтобы это выглядело так:

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
  <Parent>
    <ChildType1>contentA</ChildType1>
    <ChildType2>contentB</ChildType2>
    <ChildType3>contentC</ChildType3>
    <ChildType1>contentD</ChildType1>
    <ChildType3>contentE</ChildType3>
  </Parent>
</edmx:Edmx>

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Чтобы заменить Parent узлы, вы можете использовать XElement.ReplaceNodes() для замены дочерних узлов корня.Замените эти узлы новым узлом Parent, который содержит дочерние узлы замененных узлов.

doc.Root.ReplaceNodes(
    new XElement("Parent",
        doc.Root.Elements("Parent").Elements()
    )
);
0 голосов
/ 16 мая 2018

Это довольно просто, когда вы понимаете, как играть с XDocument, XElement.Я только что создал List<XElement>, чтобы собрать все дочерние элементы, а затем просто добавлю их к новому родителю и назначу родительский элемент для корня.

Я бы настоятельно рекомендовал создать новый документчем обновление существующего.

Решение 1: Подробная версия, чтобы понять, как она работает.

XDocument xDoc = XDocument.Parse(str);
List<XElement> allChildNodes = new List<XElement>();
foreach (var parent in xDoc.Root.Elements("Parent"))
{
    allChildNodes.AddRange(parent.Descendants());
}
XElement xParent = new XElement("Parent");
xParent.Add(allChildNodes);
xDoc.Root.Descendants().Remove();
xDoc.Root.Add(xParent);

Решение 2: Спасибо Джеффу Меркадо, у нас есть компактная версия.

XDocument xDoc = XDocument.Parse(str);
xDoc.Root.ReplaceNodes(
    new XElement("Parent", // New parent element is created
    xDoc.Root.Elements("Parent").Elements()));

Вывод:

<root>
  <Parent>
    <ChildType1>contentA</ChildType1>
    <ChildType2>contentB</ChildType2>
    <ChildType3>contentC</ChildType3>
    <ChildType1>contentD</ChildType1>
    <ChildType3>contentE</ChildType3>
  </Parent>
</root>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...