Linq to XML - 搜索深层元素是否存在

发布于 2024-11-04 07:25:50 字数 820 浏览 1 评论 0原文

我只想检查 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
        );

I simply want to check to see if a certain element exists in my XML file. The element is a few levels deep. The following code works fine, but is the shortest syntax I can come up with. Can anyone think of a way to do this more fluently without resorting to classic XPath syntax?

        //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
        );

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

后知后觉 2024-11-11 07:25:50
Console.WriteLine(doc.Root.Descendants("Book").Any());
Console.WriteLine(doc.Root.Descendants("Book").Any());
上课铃就是安魂曲 2024-11-11 07:25:50

这可行 - 假设您确实需要确切的层次结构,因为它们可能是不相关子树中的 Book 节点,否则您可以使用 Descendants() :

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

复数 < code>Elements() 不需要 null 检查,因为如果不存在这样的元素,它只会返回一个空枚举,因此它仍然是可链接的。

This would work - assuming you actually do need the exact hierarchy because they might be a Book node in an unrelated sub tree, otherwise you can use Descendants():

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

The plural Elements() does not require the null check since it will just return an empty enumeration if no such element exists, so it is still chainable.

溇涏 2024-11-11 07:25:50

可能不会更短,但是:

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

Probably not shorter but:

var isBookExist = 
    (from store in doc.Elements("Bookstore")
     from books in store.Elements("Books")
     from book in books.Elements("Book")
     select book).Any();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文