Linq to XML - поиск существования глубокого элемента - PullRequest
2 голосов
/ 29 апреля 2011

Я просто хочу проверить, существует ли определенный элемент в моем XML-файле. Элемент глубиной в несколько уровней. Следующий код работает нормально, но это самый короткий синтаксис, который я могу придумать. Кто-нибудь может придумать способ сделать это более свободно, не прибегая к классическому синтаксису XPath?

        //create simple sample xml
        XDocument doc = new XDocument(
        new XDeclaration("1.0", "utf-8", "yes"),
        new XElement("Bookstore",
            new XAttribute("Name", "MyBookstore"),
            new XElement("Books",
                new XElement("Book",
                    new XAttribute("Title", "MyBook"),
                    new XAttribute("ISBN", "1234")))));

        //write out a boolean indicating if the book exists
        Console.WriteLine(
            doc.Element("Bookstore") != null &&
            doc.Element("Bookstore").Element("Books") != null &&
            doc.Element("Bookstore").Element("Books").Element("Book") != null
        );

Ответы [ 3 ]

6 голосов
/ 29 апреля 2011
Console.WriteLine(doc.Root.Descendants("Book").Any());
5 голосов
/ 29 апреля 2011

Это сработает - при условии, что вам действительно нужна точная иерархия, поскольку они могут быть узлом Book в несвязанном поддереве, в противном случае вы можете использовать Descendants():

Console.WriteLine( doc.Elements("Bookstore")
                      .Elements("Books")
                      .Elements("Book")
                      .Any());

во множественном числе Elements() не требует проверки null, поскольку он просто вернет пустое перечисление, если такого элемента не существует, поэтому он по-прежнему может быть цепным.

3 голосов
/ 29 апреля 2011

Вероятно, не короче, но:

var isBookExist = 
    (from store in doc.Elements("Bookstore")
     from books in store.Elements("Books")
     from book in books.Elements("Book")
     select book).Any();
...