2015-03-27 2 views
0

В ответе мы получаем xml-файл, затем конвертируем в SimpleXMLElement, затем обращаемся к элементам и атрибутам по мере необходимости. Тем не менее, мы получаем «Попытка получить свойство не-объекта», когда xml загружается непосредственно из ответа строки по сравнению с сохраненным ответом.SimpleXMLElement - попытка получить свойство не-объекта

//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... 

Что бы вызвать XML сбой при использовании simplexml_load_string вместо simplexml_load_file?

Вот отрывок из файла 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> 
+0

и ваша строка хорошо сформирована? разместите свою строку –

+0

Да, хорошо сформирована. response.xml равно $ response. Я бы опубликовал, но это 50k строк ... – TimNguyenBSM

+0

уменьшить строки в xml, и если он работает с simplexml_load_file, отредактируйте вопрос с содержимым xml –

ответ

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 
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->asXML(), так как он покажет вам документ как XML, который лучше показывает, что у вас есть (или нет).

+0

Спасибо за ответ. Я не указал это, но части 1 и 2 не работают в последовательности. Я прокомментирую часть 1, прежде чем пытаться выполнить часть 2. Это странная проблема и, похоже, происходит только с ответом одного конкретного поставщика, однако исходная строка выглядит нормально. – TimNguyenBSM

+0

Затем я настоятельно рекомендую не отлаживать с помощью 'var_dump' или' print_r' в ** SimpleXMLElement **, но вместо этого использовать '$ response-> asXML ('php: // output');' для вывода фактического XML-документа загружен. Это должно дать вам больше информации о том, что на самом деле было загружено. – hakre

Смежные вопросы