XPath查找具有特定值的属性

XPath查找具有特定值的属性,xpath,Xpath,我相信这应该比我现在做的容易,但我正试图从我的消息来源得到以下回应。有人能帮我弄一下xpath吗 我正在尝试选择值为“extract”的行元素。在现实世界中,我正在读取一个文本文件并使用xml,我想找出读取摘录的行 来源 <line> <line number="1">blah</line> <line number="2">extract</line> <line number="3">blah</line>

我相信这应该比我现在做的容易,但我正试图从我的消息来源得到以下回应。有人能帮我弄一下xpath吗

我正在尝试选择值为“extract”的行元素。在现实世界中,我正在读取一个文本文件并使用xml,我想找出读取摘录的行

来源

<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']