SimpleXML и print_r () - почему здесь пусто?

Привет, вот мой XML-файл: (thefile)

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://nts-de-osm1-pxc/webservices/">
  <Item xmlns:q1="http://systinet.com/wsdl/com/osm/webservices/service/" xsi:type="q1:Document">

    <q1:attributes>
      <q1:Attribute>
        <q1:dataDictionary xsi:nil="true" />
        <q1:dataType>string</q1:dataType>
        <q1:displayName>AEND_DATUM</q1:displayName>
        <q1:key>false</q1:key>
        <q1:name>AEND_DATUM</q1:name>
        <q1:searchable>true</q1:searchable>
        <q1:userAttribute>true</q1:userAttribute>
        <q1:value>10.05.10</q1:value>
      </q1:Attribute>
      <q1:Attribute>
        <q1:dataDictionary xsi:nil="true" />
        <q1:dataType>string</q1:dataType>
        <q1:displayName>AEND_PRUEF_DATUM</q1:displayName>
        <q1:key>false</q1:key>
        <q1:name>AEND_PRUEF_DATUM</q1:name>
        <q1:searchable>true</q1:searchable>
        <q1:userAttribute>true</q1:userAttribute>
        <q1:value>10.05.10</q1:value>
      </q1:Attribute>
    </q1:attributes>
  </Item>
</ArrayOfItem>

Вот мой код

$xml = simplexml_load_file($thefile);
print_r($xml);

Это результат

SimpleXMLElement Object
(
    [Item] => SimpleXMLElement Object
        (
        )

)

Почему это пусто?


person sschnake    schedule 24.06.2010    source источник


Ответы (3)


Не используйте print_r () или var_dump () для проверки SimpleXMLElement, они не обязательно будут работать с ними, потому что SimpleXML использует много волшебства за сценой. Вместо этого посмотрите, что возвращает asXML().

В вашем случае <q1:attributes/> не отображается, потому что они находятся в разных пространствах имен.

Редактировать

Для доступа к этим узлам с пространством имен существует много разных способов, большинство из них обсуждаются здесь, в Stack Overflow. Если не получается, задайте новый вопрос, потому что тема другая. Вот 3 способа получить доступ к этим элементам:

$ArrayOfItem->Item->children("http://systinet.com/wsdl/com/osm/webservices/service/");
$ArrayOfItem->Item->children('q1', true);
$ArrayOfItem->Item->xpath('//q1:Attribute');
person Josh Davis    schedule 24.06.2010
comment
sXML () показывает мне XML-файл, но как теперь выбрать один узел? echo $ xml- ›ArrayOfItem-› Item- ›attributes-› Attribute [0] - ›value; не показывать ничего - person sschnake; 25.06.2010

Синтаксический анализатор simpleXML должен выдавать содержательное сообщение об ошибке, которое можно извлечь и вывести. Посмотрите пример кода в документации на libxml_get_errors() .

person Pekka    schedule 24.06.2010
comment
@sschnake @pinaki указывает по крайней мере на одну серьезную ошибку, не так ли? (отсутствующий закрывающий тег) - person Pekka; 24.06.2010
comment
Да, XML был недействительным (я исправил исходный пост) и вызвал как минимум 3 предупреждения PHP. Проверьте свой уровень error_reporting. Попробуйте добавить error_reporting(-1); в начало ваших скриптов, иначе вы пропустите очень многие из этих ошибок. - person Josh Davis; 24.06.2010

Две вещи:

  • Вам не хватает закрывающего тега для q1: атрибутов.
  • SimpleXML не может обрабатывать теги типа <q1:Attributes>. Я изменил его на <q1>, и он работает до этого тега.

Я думаю, вам нужен парсер SimpleXML здесь

person pinaki    schedule 24.06.2010
comment
Я исправил XML. В остальном SimpleXML поддерживает пространства имен, здесь нет проблем. - person Josh Davis; 24.06.2010