PHP 访问 SimpleXMLElement 中包含的数组

问题描述 投票:0回答:1

以下代码

<?php 

$ans=<<<XML
<?xml version="1.0" encoding="utf-8"?>
<ResponseDoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <response>
    <index>1</index>
    <statusCode>Success</statusCode>
  </response>
  <response>
    <index>2</index>
    <statusCode>Success</statusCode>
  </response>
  <response>
    <index>3</index>
    <statusCode>Success</statusCode>
  </response>
  <response>
    <index>4</index>
    <statusCode>Success</statusCode>
  </response>
</ResponseDoc>
XML;

$r1= simplexml_load_string($ans);
        print_r($r1);
echo '<br>---------------------------------<br>';       
        $r2=$r1->response;  
        print_r($r2);
echo '<br>---------------------------------<br>';       

?>

给出以下输出

SimpleXMLElement Object (
  [response] => 
  Array ( 
    [0] => SimpleXMLElement Object ( [index] => 1  [statusCode] => Success ) 
    [1] => SimpleXMLElement Object ( [index] => 2  [statusCode] => Success ) 
    [2] => SimpleXMLElement Object ( [index] => 3  [statusCode] => Success ) 
    [3] => SimpleXMLElement Object ( [index] => 4  [statusCode] => Success )
  ) 
)

---------------------------------
SimpleXMLElement Object ( [index] => 1 [statusCode] => Success )
---------------------------------

    

我无法理解为什么,因为在我当前的心理模型中,$r2应该包含一个数组,而不是索引0处的数组的值。 如果我循环

foreach($r1 as $i) echo "statusCode='{$i->statusCode}'<br>";        
foreach($r1->response as $i) echo "statusCode='{$i->statusCode}'<br>";      

两种情况下的输出(我不明白为什么它在第一种情况下有效)是:

statusCode='Success'
statusCode='Success'
statusCode='Success'
statusCode='Success'

可能我遗漏了对象和数组之间的一些区别,或者存在一些有关 SimpleXMLElement 或 print_r 和 var_dump 工作不正确的特殊细节。

php simplexml
1个回答
0
投票

输出是正确的,因为简单的 xml 解析器会自动为您提供第一个对象。但您可以通过使用 xpath 方法来克服这个问题。您还可以使用

print_r($responses)
查看 SimpleXMLElement 中每个项目的数组。

演示:https://3v4l.org/BXhC2

$r1        = simplexml_load_string($ans);
$responses = $r1->xpath('//response');

foreach ($responses as $item) {
    echo $item->index, PHP_EOL;
    echo $item->statusCode, PHP_EOL;
}
1
Success
2
Success
3
Success
4
Success
© www.soinside.com 2019 - 2024. All rights reserved.