【问题标题】:How to check if a node with certain attribute exists, with XPath?如何使用 XPath 检查具有特定属性的节点是否存在?
【发布时间】:2013-10-28 09:11:55
【问题描述】:

所以我有这个:

<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 表达式不起作用,则返回 boolean(false),而不是数组。但就我而言,这还不够安全。

【问题讨论】:

  • 这取决于您如何评估 XPath 表达式,特别是您将结果视为什么数据类型。如果您有一个返回节点集的表达式并将其评估为布尔值,则如果该集为空,则您将获得 false,如果它不为空,您将获得 true。您使用什么编程语言/库/应用程序来评估您的 XPath?
  • @IanRoberts - 好点子!我更新了我的问题。看看这个。 :)
  • 请在您的问题中指定更优雅,到目前为止,您只提供了示例 XML 块,但没有提供 PHP 代码。优雅通常是 PHP 代码,比没有更优雅实际上是没有(或一切),所以问题应该以当前的形式回答。您可能正在寻找的是类型杂耍,例如数组和布尔值:php.net/language.types.type-juggling

标签: php xml xpath simplexml


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 检查我的问题的更新。 :) 而且,我不想通过使用 XSLT 使我的代码更复杂。
    • @Syspect:这只是示例,而不是 &lt;xsl:if&gt;,如果:php.net/if,您自然可以使用 PHP - 所以请不要通过阅读回答非典型。
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2012-08-30
    • 2020-12-03
    • 1970-01-01
    相关资源
    最近更新 更多