SimpleXML在不同服务器上使用相同数据的差异

时间:2017-10-13 18:52:26

标签: php xml linux macos simplexml

我尝试使用xpath从加载的SimpleXMLElement获取数据。 但是,相同的代码会在本地vs dev服务器上产生不同的结果。有人能指出我想要寻找的正确方向吗?

以下是在两台服务器上运行的代码:

<?php

$xml = simplexml_load_string('<?xml version="1.0"?>
<document>
    <ADDDATA>
        <PAGEN>1</PAGEN>
        <DOCN>123456789</DOCN>
        <DATE>06.07.2017</DATE>
    </ADDDATA>
</document>
');

$nodes = $xml->xpath('//DOCN');

var_dump($nodes);

本地结果(如预期):

array (size=1)
  0 => 
    object(SimpleXMLElement)[3]
      public 0 => string '123456789' (length=9)

dev(wtf)的结果:

array(1) { [0]=> object(SimpleXMLElement)#2 (0) { } }

我的本​​地环境是:

  • OSX10.12.6

  • homebrew/php/php56: stable 5.6.31 (bottled), HEAD

  • libxml2: stable 2.9.5 (bottled), HEAD [keg-only]

我的服务器是:

  • Ubuntu 14.04.3 LTS (GNU/Linux 3.13.0-57-generic x86_64)

  • PHP 5.5.9-1ubuntu4.16 (cli) (built: Apr 20 2016 14:31:27)

  • /usr/lib/x86_64-linux-gnu/libxml2.so.2.9.1

版本的差异是否会产生不同的结果?

我可能缺少一些全局配置吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

不要依赖var_dump()输出来检查SimpleXMLElement。我认为您遇到的这个具体问题与bug #66084有关。请参阅this demo,结果会在PHP 5.6.10中发生变化,这与您遇到的情况一致。错误#66084是fixed in PHP 5.6.11

您可能已经知道这一点,但以防万一:$nodes包含SimpleXMLElement的列表,而不是其值。因此,要获取节点的值,只需隐式或显式地将每个实例转换为字符串:

echo $nodes[0]; // 123456789 , implicitly
var_dump($nodes[0]->__toString()); // string(9) "123456789", explicitly
var_dump((string)$nodes[0]); // string(9) "123456789", explicitly