从simplexml_load_string访问xml数据时出现问题


issue accessing xml data from simplexml_load_string

我在访问用simplexml_load_string加载的xml数据时遇到问题。

首先使用curl从这个API中检索数据http://aesitelink.com/dataservice/DataServiceapi.asmx?op=GetInverterData

预期的答案具有以下语法:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="DataService.API">string</string>

举个例子,我从curl请求中得到以下结果

<rws_response>lt;InverterData InverterId='66531'记录Left='0'>lt;数据时间='1448273400'>lt;p i='PAC'dec='1'>22599<p>lt;p i='IAC'dec='1'>99<p>lt;p i='UAC'dec='1'>2279<p>lt;p i='FAC'dec='2'>5002<p>lt;p i='PDC'dec='1'>23545<p>lt;p i='IDC’dec='1'>37<p>lt;p i='UDC'dec='1'>6442<p>lt;p i='Temp1'dec='1'>244<p>lt;p i='Temp2'dec='1'>331<p>lt;p i="能量"dec='0'>2<p>lt;p i="总能量"dec='1'>698351<p>lt;p i="状态"dec='0'>4<p>lt/数据>lt;数据时间='1448274000'>lt;p i='PAC'dec='1'>29162<p>lt;p i='IAC'dec='1'>127<p>lt;p i='UAC'dec='1'>2296<p>lt;p i='FAC'dec='0'>50<p>lt;p i='PDC'dec='1'>30099<p>lt;p i='IDC’dec='1'>47<p>lt;p i='UDC'dec='1'>6471<p>lt;p i='Temp1'dec='1'>248<p>lt;p i='Temp2'dec='1'>335<p>lt;p i=‘能量’dec='1'>24<p>lt;p i="总能量"dec='1'>698355<p>lt;p i="状态"dec='0'>4<p>lt/数据>lt/逆变器数据>lt/rws_response>

然后,我使用simplexml_load_string函数(在我读过的几篇文章中建议使用trim):

$xml = simplexml_load_string( trim($xmlString) );
echo '<pre>';
print_r($xml);
echo '</pre>';  

因此,在$xml变量中,我得到

<pre>SimpleXMLElement Object
(
    [0] =&gt; <rws_response><inverterdata inverterid="66531" recordsleft="0"><data time="1448273400"><p i="PAC" dec="1">22599</p><p i="IAC" dec="1">99</p><p i="UAC" dec="1">2279</p><p i="FAC" dec="2">5002</p><p i="PDC" dec="1">23545</p><p i="IDC" dec="1">37</p><p i="UDC" dec="1">6442</p><p i="Temp1" dec="1">244</p><p i="Temp2" dec="1">331</p><p i="Energy" dec="0">2</p><p i="TotalEnergy" dec="1">698351</p><p i="State" dec="0">4</p></data><data time="1448274000"><p i="PAC" dec="1">29162</p><p i="IAC" dec="1">127</p><p i="UAC" dec="1">2296</p><p i="FAC" dec="0">50</p><p i="PDC" dec="1">30099</p><p i="IDC" dec="1">47</p><p i="UDC" dec="1">6471</p><p i="Temp1" dec="1">248</p><p i="Temp2" dec="1">335</p><p i="Energy" dec="1">24</p><p i="TotalEnergy" dec="1">698355</p><p i="State" dec="0">4</p></data></inverterdata></rws_response>
)
</pre>

我的目标是浏览"rws_response"xml结构,并从"p"标记的元素中获取信息。我试图使用$xml->{'0'}访问内容,但的结果

print_r($xml->{'0'});

是空的

<pre>SimpleXMLElement Object
(
)
</pre>

我应该如何继续?感谢您的支持。

与另一个大脑合作是可行的(感谢Martin;o)

我应该多照顾一下'=>'签名实际上答案中的字符串

<string xmlns="DataService.API">string</string>

实际上是作为字符串处理的!不开玩笑。因此,我不得不重新应用simplexml_load_string函数。

为了便于演示和避免显示凭据,我在本地下载了服务器答案。result.xml文件包含以下内容:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="DataService.API">&lt;rws_response&gt;&lt;InverterData InverterId='66531' RecordsLeft='0'&gt;&lt;Data Time='1448440200'&gt;&lt;p i='PAC' dec='0'&gt;0&lt;/p&gt;&lt;p i='IAC' dec='0'&gt;0&lt;/p&gt;&lt;p i='UAC' dec='0'&gt;230&lt;/p&gt;&lt;p i='FAC' dec='0'&gt;50&lt;/p&gt;&lt;p i='PDC' dec='0'&gt;0&lt;/p&gt;&lt;p i='IDC' dec='0'&gt;0&lt;/p&gt;&lt;p i='UDC' dec='1'&gt;6262&lt;/p&gt;&lt;p i='Temp1' dec='1'&gt;154&lt;/p&gt;&lt;p i='Temp2' dec='1'&gt;212&lt;/p&gt;&lt;p i='Energy' dec='0'&gt;0&lt;/p&gt;&lt;p i='TotalEnergy' dec='1'&gt;698929&lt;/p&gt;&lt;p i='State' dec='0'&gt;2&lt;/p&gt;&lt;/Data&gt;&lt;Data Time='1448440800'&gt;&lt;p i='PAC' dec='1'&gt;3894&lt;/p&gt;&lt;p i='IAC' dec='1'&gt;17&lt;/p&gt;&lt;p i='UAC' dec='1'&gt;2295&lt;/p&gt;&lt;p i='FAC' dec='2'&gt;4999&lt;/p&gt;&lt;p i='PDC' dec='0'&gt;429&lt;/p&gt;&lt;p i='IDC' dec='1'&gt;8&lt;/p&gt;&lt;p i='UDC' dec='1'&gt;5476&lt;/p&gt;&lt;p i='Temp1' dec='1'&gt;158&lt;/p&gt;&lt;p i='Temp2' dec='1'&gt;238&lt;/p&gt;&lt;p i='Energy' dec='0'&gt;0&lt;/p&gt;&lt;p i='TotalEnergy' dec='1'&gt;698929&lt;/p&gt;&lt;p i='State' dec='0'&gt;4&lt;/p&gt;&lt;/Data&gt;&lt;/InverterData&gt;&lt;/rws_response&gt;</string>

所以下面的代码对我有效

 <?php
  date_default_timezone_set('Europe/Zurich');
  libxml_use_internal_errors(true);
  $urlBase  = 'http://localhost/result.xml';
  $options=array( CURLOPT_URL            => $urlBase,
                  CURLOPT_RETURNTRANSFER => true,
                  CURLOPT_HEADER         => false,
                  CURLOPT_FAILONERROR    => true );
  $CURL=curl_init();
  if (!empty($CURL)) {
    curl_setopt_array($CURL,$options);
    $xmlString = curl_exec($CURL);    
    if (curl_errno($CURL)) {
      $error = "curl_exec error : " . curl_error($CURL);
    }
    else {  
      $xml = simplexml_load_string( trim($xmlString) );
      $xml2 = simplexml_load_string( trim($xml) );
      echo '<pre>';
      $lastData = count( $xml2->InverterData->Data ) - 1;
      if ( $lastData > 0 ) {
        foreach ( $xml2->InverterData->Data[$lastData]->p as $p) {
          foreach($p->attributes() as $a => $b) {
              echo $a .' = ' . $b . '<br/>';
          }
          echo $p . '<br/>';          
        }        
      }
      echo '</pre>';     
    }
    curl_close($CURL);  
  } 
?>

结果是

i = PAC
dec = 1
3894
i = IAC
dec = 1
17
i = UAC
dec = 1
2295
i = FAC
dec = 2
4999
i = PDC
dec = 0
429
i = IDC
dec = 1
8
i = UDC
dec = 1
5476
i = Temp1
dec = 1
158
i = Temp2
dec = 1
238
i = Energy
dec = 0
0
i = TotalEnergy
dec = 1
698929
i = State
dec = 0
4

希望这可以帮助任何人使用这个API。