проблема доступа к данным XML из simplexml_load_string

У меня проблема с доступом к данным XML, загруженным с помощью simplexml_load_string.

Сначала данные извлекаются с помощью 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><InverterData InverterId = '66531' RecordsLeft = '0'><Время данных = 1448273400><p i = 'PAC' dec = '1'>22599</п><p i = 'IAC' dec = '1'>99</п><p i = 'UAC' dec = '1'>2279</п><p i = 'FAC' dec = '2'>5002</п><p i = 'PDC' dec = '1'>23545</п><p i = 'IDC' dec = '1'>37</п><p i = 'UDC' dec = '1'>6442</п><p i = 'Temp1' dec = '1'>244</п><p i = 'Temp2' dec = '1'>331</п><p i = 'Энергия' dec = '0'>2</п><p i = 'TotalEnergy' dec = '1'>698351</п><p i = 'State' dec = '0'>4</п></Данные><Время данных = 1448274000><p i = 'PAC' dec = '1'>29162</п><p i = 'IAC' dec = '1'>127</п><p i = 'UAC' dec = '1'>2296</п><p i = 'FAC' dec = '0'>50</п><p i = 'PDC' dec = '1'>30099</п><p i = 'IDC' dec = '1'>47</п><p i = 'UDC' dec = '1'>6471</п><p i = 'Temp1' dec = '1'>248</п><p i = 'Temp2' dec = '1'>335</п><p i = 'Энергия' dec = '1'>24</п><p i = 'TotalEnergy' dec = '1'>698355</п><p i = 'State' dec = '0'>4</п></Данные></ InverterData></ rws_response>

Затем я использую функцию simplexml_load_string (с тримом, как предложено в нескольких постах, которые я прочитал) следующим образом:

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

Моя цель состоит в том, чтобы перемещаться по структуре XML ‘rws_response’ и получать информацию от теговых элементов ‘p’.
Я пытался получить доступ к содержимому с помощью $ xml -> {‘0’}, но результат

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

пустой

<pre>SimpleXMLElement Object
(
)
</pre>

Как мне поступить?
Спасибо за вашу поддержку.

1

Решение

Сотрудничество с другим мозгом было способом пойти (спасибо Мартину; 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.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]