如何使用“路径”查询 XDocument?

Posted

技术标签:

【中文标题】如何使用“路径”查询 XDocument?【英文标题】:How can I query an XDocument with a 'path'? 【发布时间】:2012-06-27 10:52:12 【问题描述】:

我想查询给定路径的 XDocument 对象(例如“/path/to/element/I/want”),但我不知道如何继续。

【问题讨论】:

how to use XPath with XDocument? 的可能重复项 你可以在这里看到一个选择不同路径的例子,有/没有命名空间定义等:***.com/a/38272604/5838538。 【参考方案1】:

您可以使用System.Xml.XPath.Extensions 中的方法来执行此操作。

例如,如果要选择单个元素,则可以使用XPathSelectElement()

var element = doc.XPathSelectElement("/path/to/element/I/want");

查询不必像您描述的那样是简单的路径,它们使用XPath 语言。

【讨论】:

在 4.5 中,使用 System.Xml.XPath。 @lionheart 这不正是我建议的吗? System.Xml.XPath 命名空间在 .Net 4.5 中当然不是新的。【参考方案2】:

尽管这是一篇较旧的帖子,但应该注意LINQ-to-XML 可以用作System.XML.XPath 的替代品,以根据XDocument 中的路径查找元素

例子:

var results = x.Elements("path").Elements("to").Elements("element").Elements("I").Elements("want").FirstOrDefault();

注意:可能需要更改 LINQ to XML 命令以适应 XML 的实际结构和/或基数。

https://msdn.microsoft.com/en-us/library/bb675156.aspx

【讨论】:

【参考方案3】:

我需要做类似的事情。这个repo 有几个单元测试演示使用 XPathEvaluate() 进行 XDocument 查询

【讨论】:

【参考方案4】:

类似的东西可能会起作用:

var path = "/path/to/element/I/want";
var route = path.Split(new []'/', StringSplitOptions.RemoveEmptyEntries);

XElement result = null;
foreach (var node in route)

    if (result == null)
    
        result = _xmlDocument.Element(node);    
    
    else
    
        result = result.Element(node);
    


return result;

【讨论】:

RemoveEmptyEntries 不是个好主意,// 在 XPath 中有一个特定的含义,就是搜索所有后代。

以上是关于如何使用“路径”查询 XDocument?的主要内容,如果未能解决你的问题,请参考以下文章

如何在构建 XDocument 时执行 LINQ 查询?

如何使用 XDocument 添加 xml 前缀?

C# XDocument 如何使用 linq 过滤元素

使用 HttpClient,如何将 XDocument 直接保存到请求流中?

如何使用 C# XDocument 读取 xml 文件?

如何将 XPath 与 XDocument 一起使用?