2013-05-01 2 views
2

Его первая работа с XML-файлом, и я использую SimpleXML.Получение XML-значений с помощью простого XML

Я под впечатлением, что делать $xml->dni-listings->get-listings-by-day->current->date возможно? но я не знаю, как это сделать. В настоящее время единственным способом, который мне удалось это сделать, является следующий код. но я нахожу, что он слишком долго наматывается на что-то, что, безусловно, должно быть проще?

Мой файл XML здесь http://www.dmax.it/tvl-fe/day/?type=day&channel_code=DXIT-IT&filter=1130&date=01052013

enter image description here

$file = file_get_contents ('http://www.dmax.it/tvl-fe/day/?type=day&channel_code=DXIT-IT&filter=1130&date=01052013'); 
$xml = new SimpleXMLElement ($file); 

foreach($xml->children()->children() as $child) 
    { 
    echo $child->getName() . "<br />"; 
    if ('current' == $child->getName()){ 
     echo $child->date . "<br />"; 
    } 
} 
+0

Просто некоторые ссылки (я видел, как вы до сих пор решить ее уже, но это может быть интересно, тем не менее): [Использование имен XML узла с дефисом в PHP] (http://stackoverflow.com/q/3634599/367456) и известные [* SimpleXML основные примеры использования *] (http://php.net/simplexml.examples-basic) – hakre

ответ

1

Хорошо, после того, как много проб и ошибок я нашел решение.

По-видимому, существует несколько способов добраться до элементов-потомков, вызвав их children(), чтобы потом было доступно всех детей на этом уровне.

Это, как я получил date:

$xml->children()->children()->current->date; 

и дефиса атрибутов это, как я их просмотра:

$xml->children()->children()->{'previous-date'}->formatted; 

Также я нашел другой способ сделать это

$namespacesMeta = $xml->getNamespaces(true); 
$xml->children(@$namespacesMeta['dni-listings'])->children(@$namespacesMeta['get-listings-by-day'])->children(@$namespacesMeta['current'])->date; 

Я поставил @ перед переменной, потому что другой мудрый я получаю это Notice: Undefined index: get-listings-by-day in C:\xampp\htdocs\test.php on line 8, но это еще один способ сделать это

вопрос с моей первоначальной проблемой из-за того, что вещи были дефис и мой путь должен был больше похож

$xml->{'get-listings-by-day'}->current->date 
+1

Вы получаете предупреждения, потому что таких пространств имен нет.Вместо того, чтобы скрывать предупреждение ('@' -оператор), исправьте причину;) Просто не используйте пространства имен там, где их нет;) – hakre

1

$xml себя представляет корневой узел в вашем случае <dni-listings>, поэтому оставьте, что один в пути:

$dates = $xml->{'get-listings-by-day'}->current->date 

даст вам дату. Показать все даты:

foreach ($dates as $date) echo $date; 

видеть, что это работает: http://codepad.viper-7.com/xTyeML

+0

почему голос? – michi

+0

Ваш ответ кажется законным. Он также показывает Джонатану, как скомбинировать код и не дать ему ошибочно использовать пространства имен здесь (поскольку в документе нет пространств имен). Счетчик upvote был разблокирован. – hakre

0

Обратите внимание, что XML :: Simple не рекомендуется для новых приложений.

Я обращаюсь к элементам с использованием хешей Perl. Для простых случаев я использую:

$xml = new SimpleXMLElement ($file, keyattr => []); 
$xml->{dni-listings}->{get-listings-by-day}->{current}->{date}; 

Если вы хотите, чтобы написать XML обратно и не иметь его складывать вещи как в один тег, вам может понадобиться использовать опцию ForceArray. Это немного сложнее, но работает хорошо.

$xml = new SimpleXMLElement ($file, ForceArray => 1, keyattr => []); 
$xml->{dni-listings}[0]->{get-listings-by-day}[0]->{current}[0]->{date}[0]; 
Смежные вопросы