XDocument AncestorAndSelf - PullRequest
       6

XDocument AncestorAndSelf

0 голосов
/ 14 февраля 2012

В настоящее время у меня есть XML-структура, которая выглядит примерно так

<Parent>
 <Info>
   <Info-Data></Info-Data>
   <Info-Data2></Info-Data2>
 </Info>
 <Message>
   <Foo></Foo>
   <Bar></Bar>
 </Message>
 <Message>
   <Foo/>
   <Bar/>
 </Message>
</Parent>

Я пытаюсь выполнить разделение каждого сообщения на его собственный уникальный XDocument.Я хочу, чтобы это было

<Parent>
 <Info />
 <Message />
</Parent> 

Я пытался сделать следующее.

XDocument xDoc = XDocument.Parse(myXMLString);

IEnumerable<XElement> elements = xDoc.Descendants(xDoc.Root.Name.NameSpace + "Message");

foreach(XElement element in elements)
{
  XDocument newDoc = XDocument.Parse(element.ToString());
}

Очевидно, что это получает только все из сообщения и ниже.Я пытался использовать Ancestors и AncestorsAndSelf, но они всегда включают ОБА Сообщения.Я должен сделать другой звонок?

1 Ответ

1 голос
/ 14 февраля 2012

Если ваш формат установлен так, это не так плохо:

foreach(XElement element in elements)
{
    XDocument newDoc = new XDocument
        (new XElement(xDoc.Root.Name,
            xDoc.Root.Element("Info"),
            element));
    // ...
}

Это не здорово, но не ужасно.Альтернативой является клонирование исходного документа, удаление всех элементов сообщения, а затем повторное клонирование «выпотрошенной» версии и добавление одного элемента за раз к новому клону:

XDocument gutted = new XDocument(xDoc);
gutted.Descendants(xDoc.Root.Name.Namespace + "Message").Remove();

foreach(XElement element in elements)
{
    XDocument newDoc = new XDocument(gutted);
    newDoc.Root.Add(element);
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...