Цикл через XML-объект в php

0

Я пытаюсь пройти через объект xml, как это...

$xml_url = "http://somdomain.com/frieventexport.php";

$curl = curl_init();
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $curl, CURLOPT_URL, $xml_url );

$xml = curl_exec( $curl );
curl_close( $curl );

$document = new DOMDocument;
$document->loadXML( $xml );

var_dump($document);
//echo $document->childNodes[1];

С var_dump я получаю это.

object(DOMDocument)#1 (34) { ["doctype"]=> NULL ["implementation"]=> string(22) "(object value omitted)" ["documentElement"]=> NULL ["actualEncoding"]=> NULL ["encoding"]=> NULL ["xmlEncoding"]=> NULL ["standalone"]=> bool(true) ["xmlStandalone"]=> bool(true) ["version"]=> string(3) "1.0" ["xmlVersion"]=> string(3) "1.0" ["strictErrorChecking"]=> bool(true) ["documentURI"]=> NULL ["config"]=> NULL ["formatOutput"]=> bool(false) ["validateOnParse"]=> bool(false) ["resolveExternals"]=> bool(false) ["preserveWhiteSpace"]=> bool(true) ["recover"]=> bool(false) ["substituteEntities"]=> bool(false) ["nodeName"]=> string(9) "#document" ["nodeValue"]=> NULL ["nodeType"]=> int(9) ["parentNode"]=> NULL ["childNodes"]=> string(22) "(object value omitted)" ["firstChild"]=> NULL ["lastChild"]=> NULL ["previousSibling"]=> NULL ["attributes"]=> NULL ["ownerDocument"]=> NULL ["namespaceURI"]=> NULL ["prefix"]=> string(0) "" ["localName"]=> NULL ["baseURI"]=> NULL ["textContent"]=> string(0) "" }

кто-нибудь знает, как извлечь информацию из этого и использовать отдельные xml-элементы?

это будет в xml:

<event>
<titel>Eventtitle</titel>
<datum>07.03.2015</datum>
<von>18:30</von>
<bis>23:00</bis>
<ort>Something</ort>
<referent>BezRKdo</referent>
<veranstalter>Who does it.</veranstalter>
</event>

Я не знаю, как пройти через этот дамп и извлечь информацию. С уважением, Мэтт

Теги:
loops

2 ответа

1
Лучший ответ
<?php

$xml_url = "http://localhost/site.xml";

$curl = curl_init();
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $curl, CURLOPT_URL, $xml_url );

$xml = curl_exec( $curl );
curl_close( $curl );

$xml = iconv('UTF-8', 'UTF-8//IGNORE', $xml);

$document = new DOMDocument;
$document->loadXML( $xml );

$events = $document->getElementsByTagName("event");

foreach( $events as $event ){
    $titels = $event->getElementsByTagName( "titel" );
    $titel= $titels->item(0)->nodeValue;

    $datums = $event->getElementsByTagName( "datum" );
    $datum = $datums->item(0)->nodeValue;

    echo $titel;

}


?>
  • 0
    Спасибо, но XML идет с этим доменом выше, и это должно быть динамическим. Таким образом, $xml вами переменная $xml не существует таким образом. Смотрите мой вывод var_dump (). Если я echo $titel внутри цикла foreach, я не получаю вывод.
  • 0
    Также, если я просто добавлю $events = $document->getElementsByTagName("event"); var_dump($events); вне цикла я получаю этот object(DOMNodeList)#2 (1) { ["length"]=> int(0) }
Показать ещё 11 комментариев
0

У вас есть только одна запись в XML, каждый элемент данных уникален. Вы можете использовать XPath для извлечения данных в виде строк.

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXPath($dom);

echo $xpath->evaluate('string(/event/titel)'), "\n";
echo $xpath->evaluate('string(/event/datum)'), ' ';
echo $xpath->evaluate('string(/event/von)'), '-';
echo $xpath->evaluate('string(/event/bis)');

Вывод:

Übung Einhausung Amras
07.03.2015 18:30-23:00

Если ваш XML будет возвращать несколько событий, вам нужно будет зацикливать элементы события и использовать узел как контекст:

Структура XML для нескольких элементов:

<events>
  <event>
    <titel>Übung Einhausung Amras</titel>
    ...
  </event>
  <event>
    <titel>Other event</titel>
    ...
  </event>
  ...
</events>

PHP, повторяющий несколько записей в XML:

foreach($xpath->evaluate('/events/event' as $event) {
  echo $xpath->evaluate('string(/event/titel)', $event), "\n";
  // ...
}

кодирование

В декларации XML в ответе отсутствует кодировка. Это <?xml version="1.0"?>, Но это должно быть что-то вроде <?xml version="1.0" encoding="ISO-8859-1"?>.

DOMDocument по умолчанию использует UTF-8. Вы можете преобразовать строку или убедиться, что XML определяет кодировку.

$xml = iconv('ISO-8859-1', 'UTF-8//IGNORE', $xml);

Из-за используемой кодировки utf8_encode() также должен работать:

$xml = utf8_encode($xml);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню