XPath:如何根据它们的值选择元素?
我是使用XPath的新手,这可能是一个基本问题。 请耐心等待并帮助我解决问题。 我有这样的XML文件:
<RootNode>
<FirstChild>
<Element attribute1="abc" attribute2="xyz">Data</Element>
<FirstChild>
</RootNode>
我可以验证<Element>
标签的存在:
//Element[@attribute1="abc" and @attribute2="xyz"]
现在我也想检查字符串"Data"
的标签值。 为了达到这个目的,我被告知要使用:
//Element[@attribute1="abc" and @attribute2="xyz" and Data]
当我使用后面的表达式时,出现以下错误:
断言失败消息:无节点匹配//Element[@attribute1="abc" and @attribute2="xyz" and Data]
请向我提供您的建议,不管我使用的XPath表达式是否有效。 如果不是什么将是有效的XPath表达式?
以下条件:
//Element[@attribute1="abc" and @attribute2="xyz" and Data]
检查元素内是否存在元素数据,而不是元素值数据。
相反,你可以使用
//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]
我添加这个答案的原因是我想解释的关系.
和text()
。
第一件事是当使用[]
,只有两种类型的数据:
*[number]
从节点集中选择一个节点 *[bool]
从节点集过滤节点集 在这种情况下,该值通过函数boolean()
计算为布尔boolean()
,并且存在一条规则:
过滤器总是根据上下文进行评估。
当你需要比较text()
或.
与一个字符串"Data"
,它首先使用string()
函数将它们转换为字符串类型,而不是获得布尔结果。
关于string()
有两个重要的规则:
string()
函数通过返回节点集中第一个节点的字符串值将节点集转换为字符串,这在某些情况下可能会产生意想不到的结果。
text()
是相对路径,返回节点集包含当前节点(上下文节点)的所有文本节点,如["Data"]
。 当通过string(["Data"])
进行评估时,它将返回节点集的第一个节点,所以只有在节点集中只有一个文本节点时才会得到“Data”。
如果您希望string()
函数连接所有子文本,则必须传递单个节点而不是节点集。
例如,我们得到一个节点集['a', 'b']
,您可以将父节点传递给string(parent)
节点string(parent)
,这将返回'ab'
,并导致string(.)
在您的情况下将返回串联的字符串"Data"
。
只有存在文本节点时,两种方式才会得到相同的结果。
链接地址: http://www.djcxy.com/p/78161.html