Почему SimpleXMLElement возвращает пустой объект?

Я использую метод SimpleXMLElement для загрузки строки, но он просто не работает. Мой код:

$xml = new SimpleXMLElement($content);
var_dump($xml);

И var_dump возвращает

object(SimpleXMLElement)#104 (0) { }

Var $ content правильно настроен и заполнен, если я повторю эту переменную, вот результат:

<?xml version="1.0" encoding="utf-8" ?> 
<string xmlns="http://www.jadlog.com.br/JadlogWebService/services"> 
    <Jadlog_Tracking_Consultar> 
        <ND> 
            <Numero>10080780714284</Numero> 
            <Status>ENTREGUE</Status> 
            <DataHoraEntrega>16/06/2011</DataHoraEntrega> 
            <Recebedor>DIEGO OLIVEIRA CRUZ</Recebedor> 
            <Documento>0883473380</Documento> 
            <Evento> 
                <Codigo></Codigo> 
                <DataHoraEvento>10/06/2011 19:51</DataHoraEvento> 
                <Descricao>EMISSAO </Descricao> 
                <Observacao>CO SAO PAULO 08</Observacao> 
            </Evento> 
            <Evento> 
                <Codigo></Codigo> 
                <DataHoraEvento>10/06/2011 20:12</DataHoraEvento> 
                <Descricao>TRANSFERENCIA </Descricao> 
                <Observacao>TECA JAD SAO</Observacao> 
            </Evento> 
            <Evento> 
                <Codigo></Codigo> 
                <DataHoraEvento>10/06/2011 20:53</DataHoraEvento> 
                <Descricao>ENTRADA </Descricao> 
                <Observacao>TECA JAD SAO</Observacao> 
            </Evento> 
            <Evento> 
                <Codigo></Codigo> 
                <DataHoraEvento>10/06/2011 21:05</DataHoraEvento> 
                <Descricao>TRANSFERENCIA </Descricao> 
                <Observacao>FL JAD SALVADOR</Observacao> 
            </Evento> 
            <Evento> 
                <Codigo></Codigo> 
                <DataHoraEvento>12/06/2011 10:27</DataHoraEvento> 
                <Descricao>ENTRADA </Descricao> 
                <Observacao>FL JAD SALVADOR</Observacao> 
            </Evento> 
            <Evento> 
                <Codigo></Codigo> 
                <DataHoraEvento>12/06/2011 11:21</DataHoraEvento> 
                <Descricao>TRANSFERENCIA </Descricao> 
                <Observacao>CO SALVADOR 02</Observacao> 
            </Evento> 
            <Evento> 
                <Codigo></Codigo> 
                <DataHoraEvento>12/06/2011 11:25</DataHoraEvento> 
                <Descricao> ATRASO TRANSPORTE</Descricao> 
                <Observacao>FL JAD SALVADOR</Observacao> 
            </Evento> 
            <Evento> 
                <Codigo></Codigo> 
                <DataHoraEvento>12/06/2011 11:51</DataHoraEvento> 
                <Descricao>TRANSFERENCIA </Descricao> 
                <Observacao>CO SALVADOR 02</Observacao> 
            </Evento> 
            <Evento> 
                <Codigo></Codigo> 
                <DataHoraEvento>14/06/2011 14:28</DataHoraEvento> 
                <Descricao>ENTRADA </Descricao> 
                <Observacao>CO SALVADOR 02</Observacao> 
            </Evento> 
            <Evento> 
                <Codigo></Codigo> 
                <DataHoraEvento>14/06/2011 16:14</DataHoraEvento> 
                <Descricao>ENTRADA </Descricao> 
                <Observacao>CO SALVADOR 02</Observacao> 
            </Evento> 
            <Evento> 
                <Codigo></Codigo> 
                <DataHoraEvento>14/06/2011 18:10</DataHoraEvento> 
                <Descricao>EM ROTA </Descricao> 
                <Observacao>CO SALVADOR 02</Observacao> 
            </Evento> 
            <Evento> 
                <Codigo></Codigo> 
                <DataHoraEvento>16/06/2011 08:59</DataHoraEvento> 
                <Descricao>ENTREGUE </Descricao> 
                <Observacao>CO SALVADOR 02</Observacao> 
            </Evento> 
        </ND> 
    </Jadlog_Tracking_Consultar> 
</string>

Может ли кто-нибудь помочь мне с этим?


person Italo André    schedule 11.07.2011    source источник
comment
Он правильно сформирован, правда?   -  person BoltClock    schedule 11.07.2011
comment
Я не знаю, ошибка ли это (или функция), но попробуйте преобразовать ее в строку. например var_dump ((строка) $ xml); Кроме того, если вы хотите, чтобы он свалил все дерево, вам лучше перестать желать.   -  person yoavmatchulsky    schedule 11.07.2011
comment
@BoltClock Я верю, что это так. Я не уверен, так как я новичок в XML. Кроме того, этот XML был создан не мной, я получаю его динамически из веб-сервиса.   -  person Italo André    schedule 11.07.2011
comment
Я последовал примеру XML отсюда php.net/manual/en/simplexml .examples-basic.php и упомянул @FinalForm, и это сработало. Так что я что-то не так делаю. Я пытаюсь повторить $ xml- ›Evento [0] -› DataHoraEvento, но ничего не получил. Var_dump возвращает NULL.   -  person Italo André    schedule 11.07.2011
comment
@Italo: Если вы сами нашли решение, опубликуйте его в качестве ответа и примите его. Не редактируйте ответ в вопросе.   -  person Lightness Races in Orbit    schedule 11.07.2011
comment
Спасибо за внимание, @Tomalak. Но я осознаю это, у меня просто не было достаточно репутации, чтобы добавить ответ на вопрос, заданный мной. Теперь я могу ввести ответ (как я только что сделал), но мне нужно подождать несколько часов, чтобы принять его.   -  person Italo André    schedule 12.07.2011
comment
@Italo: Ничего страшного. Подождите, затем примите. Спасибо за участие!   -  person Lightness Races in Orbit    schedule 13.07.2011


Ответы (3)


Он не может быть «пустым» - например, попробуйте $xml->children();. Насколько мне известно, SimpleXmlElement не ведет себя как другие объекты PHP, поскольку когда вы var_dump его (хотя я думаю, что он работает с print_r по какой-то причине), он не показывает вам своих членов.

person Ross    schedule 11.07.2011
comment
И var_dump, и print_r попытаются предоставить вам некоторые данные, но из-за волшебного API, скрытого за объектами SimpleXML, они не всегда показывают вам все, что там есть. - person IMSoP; 14.10.2013

Проблема была в веб-сервисе, он возвращал объект Soap, но я смог увидеть его только в исходном коде. Поскольку XML показывал нормально, я не думал, что с запросом возникла проблема. После проверки исходного кода и использования Soap для обработки запросов я смог понять это. SimpleXML отлично работает.

Всем спасибо за помощь.

person Italo André    schedule 12.07.2011

Работает нормально. XML только что был сохранен в объекте. Таким образом, вы можете получить к нему доступ, как и к любому другому объекту. Поэтому, когда вы сбрасываете содержимое $ xml, вы видите, что он говорит object. См. Пример ниже. Ниже приведен лишь случайный пример. Я просто хотел показать вам стрелку ->.

<?php    
$xml = new SimpleXMLElement($xmlstr);

echo $xml->movie[0]->plot;
?>
person FinalForm    schedule 11.07.2011
comment
Я последовал этому примеру, и он сработал. (Я получил XML со страницы руководства PHP). Это означает, что есть какая-то ошибка с XML, который я использую, или с тем, как я вызываю элементы. Я попробовал echo $ xml- ›Evento [0] -› DataHoraEvento и ничего не получил. - person Italo André; 11.07.2011
comment
@Italo André: Вероятно, вы ничего не получили, потому что ваш документ имеет пространство имен по умолчанию, а с пространствами имен SimpleXML вызывает выпадение волос. - person jasso; 11.07.2011