XPath查找具有特定值的属性
我相信这应该比我现在做的容易,但我正试图从我的消息来源得到以下回应。有人能帮我弄一下xpath吗 我正在尝试选择值为“extract”的行元素。在现实世界中,我正在读取一个文本文件并使用xml,我想找出读取摘录的行 来源XPath查找具有特定值的属性,xpath,Xpath,我相信这应该比我现在做的容易,但我正试图从我的消息来源得到以下回应。有人能帮我弄一下xpath吗 我正在尝试选择值为“extract”的行元素。在现实世界中,我正在读取一个文本文件并使用xml,我想找出读取摘录的行 来源 <line> <line number="1">blah</line> <line number="2">extract</line> <line number="3">blah</line>
<line>
<line number="1">blah</line>
<line number="2">extract</line>
<line number="3">blah</line>
<line number="4">extract</line>
</line>
废话
摘录
废话
摘录
所需答复:
<line>
<line number="2">extract</line>
<line number="4">extract</line>
</line>
摘录
摘录
甚至只是
提取
提取
好的
非常感谢,
//line[contains(text(), 'extract')]
编辑:这适用于XPath 1.0,它显然会搜索字符串(而不是要求相等)。这(如果使用XPath 1.0,请使用=
):
会给你:()
//line
不是一个好主意的原因是,你使用line
标签做两件事(你的顶部标签line
和你的孩子的line
)-你不应该这样做:-/。如果需要元素而不是文本,可以编写:
/line/line[text() eq 'extract']
最后,这将给你计数(这似乎是你真正需要的?)
因为你的主题提到了属性(即使你的问题没有提到),我假设你想找到所有匹配行的
number
属性的值。如果是:
/line/line[text()='extract']/@number
使用:
/*/*[.='extract']/text()
//text()[.='extract']
甚至:
/*/*[.='extract']/text()
//text()[.='extract']
这将失败,因为在这种情况下
//line
不等于/line/line
,并且顶部标记line
包含多个字符串,因此包含失败。而contains()
可能会在错误的值触发,例如contains(text(),'a')
将为您提供所有项目。@lassespeholt:eq
是XPath 2.0运算符。@lassespeholt:此外,我同意您的建议,不要使用start/
运算符,删除的解决方案//行[contains(text(),'extract')]
将起作用,因为line
根元素没有包含“extract”字符串的文本节点子元素。另一种情况是,如果您使用字符串值(使用当前的
隐式强制转换,或者使用字符串()
函数)。我不知道您是否正确,但XQSharp(尝试“查看评估”)说它不起作用,但可能实现错误。这是因为text()
不是一个字符串。此外,contains
可能会在错误的值触发,例如contains(…,'a')
将在blah
中为真。@Alejandro感谢XPath 2.0的注释:)@lasseSpeholt:这就是为什么区分XPath 1.0和2.0很重要的原因。后者的隐式强制转换规则较少且不同,因此需要//行[contains(text()[1],'extract')]
(隐式string()
函数调用的右侧item()
参数)。问得好,+1。请参阅我的答案,了解两个简短的解决方案。:)是的,这很简单。但它需要一些澄清。如果需要转换(XML结果),则需要XSLT。如果要选择包含字符串“extract”的文本节点,则只需使用XPath即可。如果您想选择具有“extract”字符串值的文本节点,这看起来很奇怪,因为它是一个重新查询。。。
//text()[.='extract']