PHP 5.5在SimpleXMLElement上打破了empty()

时间:2015-03-19 10:25:39

标签: php simplexml

我最近将我的PHP从5.3更新到5.5并且遇到了这个错误。

我的XML是:

<search-response>
  ...
  ...
  <results-count>12345</results-count>
</search-response>

如果我检查$ value是否为空,它总是如此。虽然这在PHP 5.3中有效。他们是否在empty()方法中改变了某些内容?

$contents = file_get_contents(dirname(__FILE__). '/dummy.xml');
$xml = new SimpleXMLElement($contents);

function xpath_val($source_xml, $argument_array) {

  $result = array();
  foreach($argument_array as $k => $v){
    $node = $source_xml->xpath($v[0]); 

    if (empty($node)) {
      $value = $node;
    } else {
      $value = $node[0];
    }

    if (empty($value)) {
      $nodeval = '';
    } else {
      $nodeval = strval($value);
    }

    echo $nodeval;
  }
}
$arr = array();
$arr['info'] = xpath_val($xml,array(
  'count'  => array('/search-response/results-count','integer')
));
var_dump($arr);

修改 return $ nodeval;而不是echo $ nodeval;给出:

array(1) {
  ["info"]=>
  string(0) ""
}

1 个答案:

答案 0 :(得分:3)

是的,从{5.4开始的 SimpleXMLElement empty状态发生了变化。在5.4之前,表示与对象访问相同的元素的 SimpleXMLElement empty($element)表示的行为与SimpleXMLElement::xpath()方法结果数组中的行为相同。

自PHP 5.4起,当使用true检查时,作为xpath结果对象的元素现在始终为empty(其他访问不会改变空行为)。

您很可能不会empty($value),而是!strlen($value)

请注意 SimpleXMLElement 带来很多魔法,var_dumpprint_r例如,不能很好地使用它。 empty也有一些细微差别。

如果您测试现有 SimpleXMLElement 的值,请将其转换为字符串。

如果要验证元素是否存在,请检查它的自引用是否为NULL。

还有一些关于5.3中断的错误报告 - &gt; 5.使用SimpleXML进行版本更改: