ChatGPT解决这个技术问题 Extra ChatGPT

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]

当我使用后面的表达式时,我收到以下错误:

断言失败消息:No Nodes Matched //Element[@attribute1="abc" and @attribute2="xyz" and Data]

请向我提供您的建议,我使用的 XPath 表达式是否有效。如果不是,那么有效的 XPath 表达式是什么?


S
SO User

下面的条件:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

检查 Element 中是否存在元素 Data 而不是元素值 Data。

相反,您可以使用

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]

p
pevik
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]

我添加这个答案的原因是我想解释 .text() 的关系。

首先是使用 [] 时,只有两种类型的数据:

[number] 从节点集中选择一个节点 [bool] 从节点集中过滤一个节点集

在这种情况下,函数 boolean() 将值评估为布尔值,并且有一个规则:

过滤器总是根据上下文进行评估。

当您需要将 text(). 与字符串 "Data" 进行比较时,它首先使用 string() 函数将它们转换为字符串类型,然后得到一个布尔结果。

关于 string() 有两个重要规则:

string() 函数通过返回节点集中第一个节点的字符串值将节点集转换为字符串,这在某些情况下可能会产生意外结果。 text() 是返回一个节点集的相对路径,该节点集包含当前节点(上下文节点)的所有文本节点,如["Data"]。当通过 string(["Data"]) 求值时,它会返回节点集中的第一个节点,因此只有当节点集中只有一个文本节点时才会得到“Data”。如果您希望 string() 函数连接所有子文本,则必须传递单个节点而不是节点集。例如,我们得到一个节点集 ['a', 'b'],您可以将那里的父节点传递给 string(parent),这将返回 'ab',因此在您的情况下 string(.) 将返回连接字符串“数据”。

只有当有文本节点时,两种方式才会得到相同的结果。