Получить корневой элемент с отфильтрованными дочерними элементами - PullRequest
1 голос
/ 04 февраля 2012

Для следующего XML:

<A>
  <B id=1>
    <C id=2 />
  </B>
  <B id=3>
    <C id=4 />
  </B>
</A>

Я хочу получить этот результат, имея значение Id 4 для C:

<A>
  <B id=3>
    <C id=4 />
  </B>
</A>

Итак, что является лучшим решением?

Ответы [ 3 ]

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

Предполагая, что у вас есть XDocument , представляющий вашу XML-структуру

var doc = XDocument.Parse(@"<A>
  <B id='1'>
    <C id='2' />
  </B>
  <B id='3'>
    <C id='4' />
  </B>
</A>");

и XElement , представляющий элемент с id='4' в этом документе

XElement x = doc.Descendants().Single(e => (int?)e.Attribute("id") == 4);

Вы можете создать новый XDocument , состоящий из этого элемента и его родительских элементов, следующим образом:

XElement y = x;

while (x.Parent != null)
{
    x = x.Parent;
    y = new XElement(x.Name, x.Attributes(), y);
}

XDocument result = new XDocument(y);

Результат:

<A>
  <B id="3">
    <C id="4" />
  </B>
</A>
1 голос
/ 04 февраля 2012

Использование:

var doc = XDocument.Parse(@"<A>
<B id='1'>
<C id='2' />
</B>
<B id='3'>
<C id='4' />
</B>
</A>");

var elementsToRemove = doc.Root.Elements("B")
    .Where(b => (int)b.Element("C").Attribute("id") != 4);

elementsToRemove.Remove();

Console.WriteLine(doc);

Выход:

<A>
  <B id="3">
    <C id="4" />
  </B>
</A>
0 голосов
/ 04 февраля 2012

Если я понимаю, это то, что вы хотите:

//*[descendant::C[@id=4]]

т.е. все элементы, которые имеют <c id="4"/> в качестве дочернего элемента.

Кстати, ваш XML должен иметь кавычки вокруг чиселбыть хорошо сформированным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...