【问题标题】:SimpleXMLElement - Trying to get property of non-objectSimpleXMLElement - 试图获取非对象的属性
【发布时间】:2015-03-27 16:36:31
【问题描述】:

在响应中,我们收到一个 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文件的sn-p:

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

【问题讨论】:

  • 你的字符串格式正确吗?发布你的字符串
  • 是的,格式正确。 response.xml 等于 $response。我会发布,但它是 50k 行...
  • 减少 xml 中的行,如果它与 simplexml_load_file 一起使用,请使用 xml 内容编辑问题
  • @AdrianCidAlmaguer 我将 xml 响应保存到 dB,然后在该 xml 响应上使用 simplexml_load_string,它现在按预期工作。我现在可以使用它,但对我来说仍然没有任何意义。
  • 世界是陌生而神秘的;-)

标签: php xml simplexml


【解决方案1】:

您只是在这里忽略了一个小细节。你说的第一部分是正确的:

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

这会从文件中加载 XML 文档。但是,当您查看第二部分时:

$response = simplexml_load_string( $response );

您不会从字符串响应中加载。 $response 代表您刚刚从文件中创建的 SimpleXMLElement。更“正确”的例子是:

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

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

更好的是var_dump 是与$response-&gt;asXML() 核对,因为它会将文档显示为 XML,从而更好地显示您拥有(或不拥有)什么。

【讨论】:

  • 感谢您的回答。我没有指定这一点,但第 1 部分和第 2 部分没有按顺序运行。我在尝试第 2 部分之前将第 1 部分注释掉。这是一个奇怪的问题,似乎只发生在一个特定供应商的响应中,但是原始字符串看起来很好。
  • 那么我强烈建议不要在 SimpleXMLElement 上使用var_dumpprint_r 进行调试,而是使用$response-&gt;asXML('php://output'); 来输出加载的实际XML 文档。这应该让您更深入地了解实际已加载的内容。
【解决方案2】:

这对我有用:

<?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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多