【问题标题】:Using PHP simpleXML to find a node I know the name of but not where it resides使用 PHP simpleXML 查找我知道名称但不知道其所在位置的节点
【发布时间】:2011-12-01 12:09:45
【问题描述】:

如果我知道要查找的节点的名称,但我可能不一定知道节点的路径,我需要在 PHP 中查询 XML 字符串。

我想我可以用 xpath 做到这一点,但我不知道如何设置一个相对路径来查看文档中的任何位置,有人能指出我正确的方向吗?

我目前正在尝试使用 simpleXML 来实现这一点,但如果有更好的方法,我很想听听。

【问题讨论】:

    标签: php xml xpath simplexml


    【解决方案1】:

    不要使用正则表达式来解析 XML!

    xpath 中的 descendant(双斜杠)运算符将在所有后代中搜索匹配项。

    $matches = $simplexmlelementobject->xpath('//nameOfElement');
    

    上面相当于DOM方法getElementsByTagName

    如果你对元素所在的位置有一个大致的了解,可以使用后代运算符在某个节点下进行搜索:

    $matches = $simplexmlelementobject->xpath('someparentelement[@conditionalattr=something]//nameOfDescendantElementYouWant');
    

    如果您需要使用DOMDocument 而不是SimpleXML,您可以在必要时使用DOMXPath 对象发出xpath 指令。 (留给读者作为练习。)

    【讨论】:

    • 这行得通。此外,如果 xml 元素名称是命名空间的,请参见 SimpleXMLElement::registerXPathNamespace,例如
    【解决方案2】:

    虽然我认为使用 simplexml 的 xpath 非常简单有效,但如果您有更多工作要做,您可能会发现其中一些替代方案对您来说更熟悉,因为它们使用 dom 或 css 选择器而不是 xpath。

    http://code.google.com/p/phpquery/

    http://querypath.org/

    http://www.php.net/manual/en/domelement.getelementsbytagname.php

    【讨论】:

      【解决方案3】:

      我不确定 XML 结构到底是什么样的,但我使用了这个blog post 来帮助解决我在 XML 解析中遇到的一些问题。它似乎解释了基础知识,而且总是参考php.net

      我希望这会有所帮助,但没有看到完整的问题,我无法完全回答问题。

      【讨论】:

      • 不幸的是没有一个具体的例子,XML 可能会改变,但节点名称将保持不变,这就是我寻找通用解决方案的原因。谢谢你的链接,我现在就读。
      猜你喜欢
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      相关资源
      最近更新 更多