首页 文章

XPath:如何根据值来选择元素?

提问于
浏览
193

我是使用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 回答

  • 11

    条件如下:

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

    检查Element中元素Data的存在,而不是元素值Data .

    相反,你可以使用

    //Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]
    
  • 290
    //Element[@attribute1="abc" and @attribute2="xyz" and .="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" .

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

相关问题