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