simpleXML возвращает пустой элемент - PullRequest
0 голосов
/ 28 сентября 2010

У меня проблема с чтением XML-ленты Образец XML-файла:

<f:feed xmlns:f="http://www.bbgo.de/feedxml/feed" xmlns:a="http://www.bbgo.de/feedxml/article" xmlns="http://www.w3.org/1999/xhtml" f:customer="blub" f:name="dax-tecdax">
<f:title>Analysen: DAX, TecDAX</f:title>
<f:date>2010-09-22T20:46:29+02:00</f:date>
<f:url>http://www.bbgo.de/export/feed/stock-channel/dax-tecdax</f:url>
<f:articles>
<a:article a:id="2310446" a:status="published" a:payed-content="false" xml:lang="de-DE">
<a:title>Kabel Deutschland mit Verkaufsempfehlung</a:title>...

Простой тест, такой как:

$feed = new SimpleXMLElement($xml);
print_r($feed);

производит

SimpleXMLElement Object ( )

если я попробую

echo $xml;

приведенный выше образец отражен правильно.

Почему массив $ feed не построен? Как я могу получить доступ ко всем <a:article> в <f:articles>?

1 Ответ

0 голосов
/ 05 октября 2010

Как я могу получить доступ ко всем <a:article> в <f:articles>?

Мне кажется, что simpleXML выглядит немного неуклюже при работе с пространствами имен (но, опять же, я не PHPкодировщик).Вы можете использовать метод children, но, на мой взгляд, использовать XPath проще.

$feed->registerXPathNamespace('f', 'http://www.bbgo.de/feedxml/feed');
$feed->registerXPathNamespace('a', 'http://www.bbgo.de/feedxml/article');
$article = feed->xpath("/f:feed/f:articles/a:article");

Сначала вам нужно зарегистрировать пространства имен с некоторыми префиксами (префиксы не должны совпадать с теми, которые используются в XMLдокумент, но URI пространства имен должны совпадать), а затем используйте эти префиксы в выражении XPath, которое выбирает цель.Без префиксов имени элемента выражение XPath будет искать элементы, которые не находятся ни в одном пространстве имен.

Почему массив $ feed не создается?

Трудно угадатьпричина для этого.Некоторые вещи, которые вы можете проверить:

  • - это строка $xml правильно сформированного XML-документа
  • создает SimpleXMLElement с явным строковым параметром и работает $feed = new SimpleXMLElement('<root><child/></root>');
  • можете ли вы загрузить документ, используя simplexml_load_file($yourXMLfile); или simplexml_load_string($yourXMLstring);
...