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

时间:2013-10-28 09:11:55

标签: php xml xpath simplexml

所以我有这个:

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

如何检查某个节点是否存在,其值attr1funky,即?我可以通过检查我的代码中返回的字符串是否为空,或者通过使用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)而不是数组。但在我的情况下,这不是一个足够安全的检查。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

  

如果XPath表达式不起作用,则会生成xpath()函数,返回boolean(false)而不是数组。但在我的情况下,这不是一个足够安全的检查。

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

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

确保在所有情况下都获得一个数组(如果表达式匹配,则为非空;如果不匹配,则为空)。