以下代码
<?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 工作不正确的特殊细节。
输出是正确的,因为简单的 xml 解析器会自动为您提供第一个对象。但您可以通过使用 xpath 方法来克服这个问题。您还可以使用
print_r($responses)
查看 SimpleXMLElement 中每个项目的数组。
$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