c# - 如何对从较大的 XDocument 中提取的 XElement 执行 XPath 选择?
问题描述
假设我将一个 XML 文档加载到内存中并提取其中的一个元素。例如:
XDocument doc = XDocument.Parse("<A><B><C/></B><D/></A>");
XElement b = doc.Descendants().Where(x => x.Name.LocalName == "B").Single();
Console.WriteLine(b);
这导致<B><C/></B>
返回,所以我有一个 XElement 代表原始 XML 文档的一小部分。
我现在想对我提取的那部分执行 XPath 选择。但是,对 XPathSelectElement/s 的试验告诉我,我所有的 XPath 表达式都在原始 XML 文档上进行操作。
b.XPathSelectElement("/A")
返回原始文档的根元素。
b.XPathSelectElement("/B")
返回空值。
b.XPathSelectElement("/")
引发异常“XPath 表达式评估为意外类型 System.Xml.Linq.XDocument。”。
如何仅对 XElement 的内容执行 XPath 选择?
(希望不要转换为字符串并重新解析。)
解决方案
除非您复制或克隆 XML 结构,否则您可以简单地使用相对于上下文节点的路径,例如
b.XPathSelectSelectElement("C")
这应该返回<C />
元素。
轴始终选择 XML的/
文档节点。
推荐阅读
- java - Firebase 安全规则需要获取孩子的多个查询
- java - 使用 BlockingQueue 的 java 异步服务实现
- javascript - 使用 jquery 和 jquery.copy-to-clipboard.js 复制到剪贴板问题
- node.js - MongoDb 根据是否指定字段进行查询
- ruby-on-rails - 我想运行一个旧的 rails 3.3.2 项目,为此寻找特定和具体的步骤
- reactjs - react-hook-form 控制器,基于值进行验证
- python - 为什么它在 python 的 codeforces 上给出运行时错误?
- r - 根据多个条件过滤行
- git - 我怎样才能发现我隐藏的 git commit 哈希?
- javascript - 抓取稍后使用 Cheerio 加载的数据