所以我有这个:
<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)而不是数组。但在我的情况下,这不是一个足够安全的检查。
答案 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()
确保在所有情况下都获得一个数组(如果表达式匹配,则为非空;如果不匹配,则为空)。