我是使用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]
当我使用后面的表达式时,我收到以下错误:
断言失败消息:没有匹配的节点//元素[@ attribute1 =“abc”和@ attribute2 =“xyz”和数据]
请向我提供您的建议,即我使用的XPath表达式是否有效 . 如果不是有效的XPath表达式?
2 回答
条件如下:
检查Element中元素Data的存在,而不是元素值Data .
相反,你可以使用
我添加这个答案的原因是我想解释
.
和text()
的关系 .第一件事是使用
[]
时,只有两种类型的数据:*[number]
从节点集中选择节点*[bool]
从节点集过滤节点集在这种情况下,函数
boolean()
将值计算为boolean,并且有一条规则:当您需要将
text()
或.
与字符串"Data"
进行比较时,它首先使用string()
函数将这些函数转换为字符串类型,而不是获取布尔结果 .有关
string()
的两条重要规则:string()
函数通过返回节点集中第一个节点的字符串值将节点集转换为字符串,这在某些情况下可能会产生意外结果 .text()
是返回节点集的相对路径,包含当前节点(上下文节点)的所有文本节点,如["Data"]
. 当string(["Data"])
评估它时,它将返回node-set的第一个节点,因此只有当节点集中只有一个文本节点时才会得到"Data" .string()
函数连接所有子文本,则必须传递单个节点而不是节点集 .例如,我们得到一个节点集
['a', 'b']
,你可以将父节点传递给string(parent)
,这将返回'ab'
,而在你的情况下string(.)
会返回一个串联字符串"Data"
.只有存在文本节点时,两种方式才会得到相同的结果 .