使用simplexml_load_file解析XML文件将返回空对象

时间:2013-04-03 12:19:26

标签: xml simplexml php

 <?xml version="1.0" ?> 
  <aws:UrlInfoResponse xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/">
   <aws:Response xmlns:aws="http://awis.amazonaws.com/doc/2005-07-11">
    <aws:OperationRequest>
    </aws:OperationRequest>
    <aws:UrlInfoResult>
     <aws:Alexa>
      <aws:TrafficData>
       <aws:DataUrl type="canonical">google.com/</aws:DataUrl> 
       <aws:Rank>1</aws:Rank> 
      </aws:TrafficData>
     </aws:Alexa>
    </aws:UrlInfoResult>
    <aws:ResponseStatus xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/">
     <aws:StatusCode>Success</aws:StatusCode> 
    </aws:ResponseStatus>
   </aws:Response>
  </aws:UrlInfoResponse>

我要解析的是这个xml文档的排名。 在尝试的同时,我正在做的是......

        $xml= simplexml_load_file("path of the file saved");
        echo $xml->Response->UrlInfoResult->Alexa->TrafficData->Rank;

但是这样做会出错。就是说

 Notice: Trying to get property of non-object in C:\wamp\www\SEO Stats[Only Testing]\Tools\web_worth.php on line 13

错误在这一行

 echo $xml->Response->UrlInfoResult->Alexa->TrafficData->Rank;
 this line is referred as line no 13..

3 个答案:

答案 0 :(得分:8)

解析器返回一个空对象,因为根据documentation你必须指定带前缀的命名空间 - 所以你想要使用类似的东西:

simplexml_load_file('/path/to/file.xml', null, null, 'aws', true);

working example

答案 1 :(得分:0)

您可能导致结果对象嵌套错误,因此$xml->Response->UrlInfoResult->Alexa->TrafficData->Rank;中的一个对象为null。分别尝试echo每一步:

echo $xml->Response;
echo $xml->Response->UrlInfoResult;
// etc ...

如果第一个echo没有返回任何内容,那么请检查是否需要输出UrlInfoResponse或者需要先注册名称空间。

答案 2 :(得分:0)

好吧,这太模糊了,但你总是可以打印$ xml值来查看它是否实际上是一个对象,有时会发生路径错误。 尝试使用此代码查看是否实际加载了xml文档:

<?php

if (file_exists('/path/to/document.xml')) {
    $xml = simplexml_load_file('/path/to/document.xml');

    print_r($xml);
} else {
    exit('Failed to open /path/to/document.xml.');
}

&GT;

有了这个,您应该看到xml文档的内容。