XPath:如何根据它们的值select元素?
我是使用XPath的新手,这可能是一个基本问题。 请耐心等待,帮助我解决问题。 我有这样的XML文件:
<RootNode> <FirstChild> <Element attribute1="abc" attribute2="xyz">Data</Element> <FirstChild> </RootNode>
我可以validation<Element>标签的存在与:
//元素[@ attribute1 =“abc”和@ attribute2 =“xyz”]
现在我也想检查string"Data"的标签值。 为了达到这个目的,我被告知要使用:
//元素[@ attribute1 =“abc”和@ attribute2 =“xyz”和Data]
当我使用后面的expression式时,出现以下错误:
断言失败消息:无节点匹配
//Element[@attribute1="abc" and @attribute2="xyz" and Data]
请向我提供您的build议,不pipe我使用的XPathexpression式是否有效。 如果不是什么将是有效的XPathexpression式?
以下条件:
//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() 。
第一件事是当使用[] ,只有两种types的数据:
-
*[number]从节点集中select一个节点 -
*[bool]从节点集过滤节点集
在这种情况下,通过函数boolean()将该值计算为布尔boolean() ,并且存在一条规则:
filter总是根据上下文进行评估。
当你需要比较text()或. 与一个string"Data" ,它首先使用string()函数将它们转换为stringtypes,比得到一个布尔结果。
关于string()有两个重要的规则:
-
string()函数通过返回节点集中第一个节点的string值将节点集转换为string,这在某些情况下可能会产生意想不到的结果。text()是返回包含当前节点(上下文节点)的所有文本节点的节点集的相对path,如["Data"]。 当用string(["Data"])进行求值时,它将返回节点集合的第一个节点,所以只有在节点集合中只有一个文本节点时才能得到“Data”。 -
如果您希望
string()函数连接所有子文本,则必须传递单个节点而不是节点集。例如,我们得到一个节点集
['a', 'b'],你可以将父节点传递给string(parent)节点string(parent),这将返回'ab',并且导致string(.)在你的情况下会返回串联的string"Data"。
只有存在文本节点时,两种方式才会得到相同的结果。
这个:
//Element[@attribute1="abc" and @attribute2="xyz" ]