Как найти узлы полностью между двумя указанными узлами - PullRequest
0 голосов
/ 13 декабря 2010

В XML-документе, таком как следующее:

<root>
  <fish value="Start"/>
  <pointlessContainer>
    <anotherNode value="Pick me!"/>
    <anotherNode value="Pick me too!"/>
    <fish value="End"/>
  </pointlessContainer>
</root>

Как я могу использовать чудо LINQ to XML, чтобы найти любые узлы полностью , содержащиеся в узлах fish? Обратите внимание, что в этом примере я намеренно разместил узлы fish на разных уровнях в документе, так как я ожидаю, что этот сценарий будет происходить в дикой природе.

Очевидно, что в этом примере я хотел бы получить два узла anotherNode, но не узел pointlessContainer.

Примечание: два узла «разграничения» могут иметь тот же тип (например, fish), что и другие узлы без разграничения в документе, но они будут иметь уникальные атрибуты и поэтому их будет легко идентифицировать.

1 Ответ

0 голосов
/ 13 декабря 2010

Для вашего образца следующее должно сделать

        XDocument doc = XDocument.Load(@"..\..\XMLFile2.xml");
        XElement start = doc.Descendants("fish").First(f => f.Attribute("value").Value == "Start");
        XElement end = doc.Descendants("fish").First(f => f.Attribute("value").Value == "End");
        foreach (XElement el in 
            doc
            .Descendants()
            .Where(d => 
                XNode.CompareDocumentOrder(d, end) == -1 
                && XNode.CompareDocumentOrder(d, start) == 1 
                && !end.Ancestors().Contains(d)))
        {
            Console.WriteLine(el);
        }

Но я не проверял и не задумывался, работает ли он в других случаях. Может быть, вы можете проверить некоторые из ваших примеров данных и сообщить, работает ли он.

...