【问题标题】:PHP SimpleXMLElement xpathPHP SimpleXMLElement xpath
【发布时间】:2018-09-01 08:31:10
【问题描述】:

我正在尝试使用来自 HTTP POST 的 XML 文件执行简单的 xpath 查找。我一直在拔头发,因为这应该有用!!到目前为止,我发现的所有内容都是命名空间的结果,但我在这个 XML 中没有命名空间。

<?xml version="1.0" encoding="UTF-8"?>
<foo>
 <bar>
  <name>Frank</name>
 </bar>
</foo>

这是我正在使用的简单代码。

$xml = new SimpleXMLElement(file_get_contents("php://input");
print_r($xml->xpath("//FOO/bar/name"));

这给了我一个空数组!

Array
(
  [0] => SimpleXMLElement Object
      (
      )
)

如果我只是做print_r($xml-&gt;xpath("//foo")); 我看到它有数据,但是一旦我尝试获取 name 的值,我什么也得不到。 :(

Array
(
  [0] => SimpleXMLElement Object
      (
      [bar] => SimpleXMLElement Object
         (
              [name] => Frank
         )
      )
)

什么是交易?谢谢!!

【问题讨论】:

  • FOO !== foo。以为我在用编辑清理代码。 CaSe 敏感性实际上是您的问题。建议关闭作为“错字”问题。 stackoverflow.com/posts/49436522/revisions
  • 看起来它在 5.6.10 之前就坏了:3v4l.org/sZX7P
  • 如果你真的只想要这个值,你可以在 5.4 之前做$xml-&gt;xpath("//foo/bar/name")[0]-&gt;__toString()。不过,这并没有解决您尝试为当前版本做的事情的根本问题。
  • 5.5 的某些行为发生了变化。在 5.5.31 时它又开始工作了,就像在 5.4 中一样。所以确切的行为将取决于版本。
  • 我使用的是损坏列表中的 5.4.16。谢谢亚历克斯。帕特里克,也谢谢你 - 这与发布的答案相似。讨厌那样“怪异”,但似乎是我正在使用的版本。

标签: php xpath simplexml


【解决方案1】:

这给了我一个空数组!

不,它没有。仔细查看你的输出,你会发现你有一个包含一个结果的数组,它是一个SimpleXMLElement 对象。

不幸的是,print_r 不能很好地处理 SimpleXMLElement 对象,并且在某些版本的 PHP 中比其他版本更好,所以它不能准确地告诉你 什么 SimpleXMLElement 你有。

但是你的生产代码不会依赖print_r,它将依赖于该元素的实际内容,所以让我们看看我们是否可以获取内容:

// Text content of an element is (string)$element
var_dump( (string)$first_result ); # string(5) "Frank"
// Render element back to XML
var_dump( $first_result->asXML() ); # string(18) "<name>Frank</name>"

这会在all versions of PHP on 3v4l.org 中提供正确的输出。所以其实一点问题都没有! :)

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2020-10-17
    相关资源
    最近更新 更多