使用 C# 在 Xpath 中查询元素
Posted
技术标签:
【中文标题】使用 C# 在 Xpath 中查询元素【英文标题】:Querying elements in Xpath using C# 【发布时间】:2020-10-15 11:29:31 【问题描述】:我在一些文档 here 的帮助下学习 Xpath,并且遇到了一个特定的查询。在以下 XML 中,我尝试打印出价格大于 10 的书籍的 <OwnerName>
的 <value>
,我使用以下 Xpath Query 来执行此操作
strExpression = "/bookstore/book/name/value[../price>10.00]";
NodeIter = nav.Select(strExpression);
Console.WriteLine("Names of expensive books owners:");
while (NodeIter.MoveNext())
Console.WriteLine("Owner Name: 0", NodeIter.Current.Value);
;
<?xml version="1.0" encoding="UTF-8"?>
<!-- This file represents a fragment of a book store inventory database -->
<bookstore>
<book genre="autobiography">
<OwnerName>
<value>Alex dan</value>
</OwnerName>
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel">
<OwnerName>
<value>Pam Sanderson</value>
</OwnerName>
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy">
<OwnerName>
<value>Rogger Mark</value>
</OwnerName>
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
我在这里做错了什么非常感谢一些帮助
【问题讨论】:
请注意,您学习的 XPath 版本已有 20 年历史并已被长期取代。 Microsoft 没有跟上 XML 世界的变化。但是,它不影响这个例子。 最新的迈克尔是什么?任何文件:) XPath 的当前版本是 3.1。介于两者之间的是 XPath 2.0。搜索其中任何一个都会找到大量信息——更多关于 2.0 的信息,因为它已经存在了更长的时间。很大程度上取决于您喜欢阅读哪种信息:就我个人而言,我直接阅读 W3C 规范。 【参考方案1】:首先,需要更改 XPath 表达式。
代替
strExpression = "/bookstore/book/name/value[../price>10.00]";
使用
strExpression = "/bookstore/book[price>10.00]/OwnerName/value";
【讨论】:
【参考方案2】:你写:
/bookstore/book/name/value[../price>10.00]
为什么它不起作用:
在 XPath 表达式的开头缺少/
(查看任何地方)
您调用的是name
元素而不是ownername
元素
缺少一个..
(父运算符),因为您想使用/price
(book
的子代而不是ownername
)
缺少[]
(谓词)来测试book
节点或price
节点
总而言之,要修复您的 XPath(按照您的逻辑),您可以使用 2 种语法:
//bookstore/book/ownername/value[../../price[.>10]]
//bookstore/book/ownername/value[../..[price>10]]
其他选项(或多或少消耗):
//value[../..[price>10]]
//value[ancestor::book[1][price>10]]
//price[.>10]/preceding::value[1]
【讨论】:
以上是关于使用 C# 在 Xpath 中查询元素的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Jsoup 中生成匹配特定元素的 XPath 查询?
xpath按元素和属性查找节点,其中包含具有特定id的子元素