SimpleXMLElement - 尝试获取非对象的属性

时间:2015-03-27 16:36:32

标签: php xml simplexml

在响应中,我们收到一个xml文件,然后转换为SimpleXMLElement,然后根据需要访问元素和属性。但是,我们正在试图获得非对象的属性"当xml直接从字符串响应加载到保存的响应时。

//This code works
$response = simplexml_load_file( "response.xml" );
var_dump($response);
echo $response->RESPONSE->RESPONSE_DATA->FILE_INFORMATION['Order_Number'];

//Returns
//object(SimpleXMLElement)#153 (4) { ["@attributes"]=> array(1)...the rest of the xml file...
//Order_Number

//This code returns error
$response = simplexml_load_string( $response );
var_dump($response);
echo $response->RESPONSE->RESPONSE_DATA->FILE_INFORMATION['Order_Number'];

//Returns
//object(SimpleXMLElement)#153 (1) { [0]=> string(33864) "" }
//Notice: Trying to get property of non-object in...

使用simplexml_load_string而不是simplexml_load_file会导致xml失败的原因是什么?

以下是xml文件的片段:

<?xml version="1.0" encoding="UTF-8"?>
<RESPONSE_GROUP>
    <RESPONSE>
        <RESPONSE_DATA>
            <FILE_INFORMATION Order_Number="19222835">
                ...
            </FILE_INFORMATION>
        </RESPONSE_DATA>
    </RESPONSE>
</RESPONSE_GROUP>

2 个答案:

答案 0 :(得分:1)

你在这里忽略了一些细节。你对第一部分说的是正确的:

$response = simplexml_load_file( "response.xml" );

这将从文件加载XML文档。但是当你看第二部分时:

$response = simplexml_load_string( $response );

您不会从字符串响应中加载。 $response代表您刚从文件创建的 SimpleXMLElement 。更多&#34;正确&#34;例如:

$buffer   = file_get_contents( "response.xml" );
$response = simplexml_load_string( $buffer );

您可能因为变量重用而感到困惑(对两个不同的事物使用相同的命名变量)。

最好var_dump$response->asXML()核对,因为它会将文档显示为XML,更好地显示您拥有(或不是)的内容。

答案 1 :(得分:0)

这对我有用:

<?php

$response = '<?xml version="1.0" encoding="UTF-8"?>
<RESPONSE_GROUP>
    <RESPONSE>
        <RESPONSE_DATA>
            <FILE_INFORMATION Order_Number="19222835">
                ...
            </FILE_INFORMATION>
        </RESPONSE_DATA>
    </RESPONSE>
</RESPONSE_GROUP>';


//This code returns error
$response = simplexml_load_string( $response );
var_dump($response);
echo $response->RESPONSE->RESPONSE_DATA->FILE_INFORMATION['Order_Number'];


?>

输出:

object(SimpleXMLElement)#1 (1) {
  ["RESPONSE"]=>
  object(SimpleXMLElement)#2 (1) {
    ["RESPONSE_DATA"]=>
    object(SimpleXMLElement)#3 (1) {
      ["FILE_INFORMATION"]=>
      string(33) "
                ...
            "
    }
  }
}
19222835