如何使用 XPath 检查是否存在具有特定属性的节点


How to check if a node with certain attribute exists, with XPath?

所以我有这个:

<Presentation>
  <Info attr1="red" attr2="blah"/>
  <Info attr1="big" attr2="iasjd"/>
  <Info attr1="funky" attr2="asf"/>
  ...
  <Info attr1="damn" attr2"..."/>
</Presentation>

如何检查是否存在一个节点,其值为 attr1 作为funky,即?我可以通过检查代码中返回的字符串是否为空count或使用 Xpath 函数检查它是否返回 0,但是否有其他函数(或方式)来检查具有该特定属性的某个节点是否存在。一些更优雅的方式?

例:正如我所能得到的情况:

<Presentation>
  <Info attr1="red" attr2="blah"/>
  <Info attr1="big" attr2="iasjd"/>
  ...
  <Info attr1="damn" attr2"..."/>
</Presentation>

由于我没有属性值funky节点 - 我在代码中做了一些其他的事情。

更新:

我在PHP中这样做。我需要检查这个 attr1 作为字符串的值是多少。所以首先我想检查是否有一个Info节点,其中 attr1 值正好是"时髦的"。如果是 - 那么在 PHP 中做一些逻辑。如果没有 - 那么做一些其他的事情(在 PHP 中)。我在 SimpleXMLElement 对象上使用函数 xpath(),所以我得到的结果是一个数组。xpath() 函数是这样创建的,如果 XPath 表达式不起作用,则返回布尔值(false),而不是数组。但就我而言,这不是一个足够安全的检查。

创建 xpath() 函数,因此如果 XPath 表达式不起作用,则返回boolean(false),而不是数组。但就我而言,这不是一个足够安全的检查。

您可以在 PHP 5.3 或更高版本中使用 "elvis" 运算符(x ?: y,相当于 x ? x : y):

$xml->xpath("/Presentation/Info[@attr1 = 'funky']") ?: array()

以确保在所有情况下都获得数组(如果表达式匹配某些内容,则为非空,如果不匹配,则为空)。

不知道你在哪里使用 XPath .但是在XPath本身中,可以测试节点是否存在。如果您使用的是XSLT则始终需要进行测试,例如使用<xsl:if>,请参阅下一个答案:

  • xpath 查找节点是否存在(2009 年 4 月)

XPath将始终返回要查找的节点或空节点。

若要获取问题中 XML 的节点,需要以下 XPath:

/Presentation/Info[@attr1 = 'funky']