Как получить значения внутри с помощью php DOM?


Как я могу получить значения внутри использование php DOM. Это немного кода из моего xml.

     <Destinations>

        <Destination>
            <![CDATA[Aghia Paraskevi, Skiatos, Greece]]]]>><![CDATA[
            <CountryCode>GR</CountryCode>
        </Destination>

        <Destination>
            <![CDATA[Amettla, Spain]]]]>><![CDATA[
            <CountryCode>ES</CountryCode>
        </Destination>

        <Destination>
            <![CDATA[Amoliani, Greece]]]]>><![CDATA[
            <CountryCode>GR</CountryCode>
        </Destination>

        <Destination>
            <![CDATA[Boblingen,  Germany]]]]>><![CDATA[
            <CountryCode>DE</CountryCode>
        </Destination>

  </Destinations>
 19
Author: Hearaman, 2011-07-13

5 answers

Работа с PHP DOM довольно проста и очень похожа на DOM Javascript.

Вот важные классы:

  • Домнод - Базовый класс для всего, что может быть пройдено внутри документа XML/HTML, включая текстовые узлы, узлы комментариев и Узлы CDATA
  • Элемент купола - Базовый класс для тегов .
  • Домдокумент - Основание класс для документов. Содержит методы загрузки/сохранения XML, а также обычные методы документов DOM (см. Ниже).

Существует несколько основных методов и свойств:

  • DOMDocument->load() - После создания нового DOMDocument используйте этот метод для этого объекта для загрузки из файла.
  • DOMDocument->getElementsByTagName() - этот метод возвращает список узлов всех элементов в документе с заданным именем тега. Затем вы можете выполнить итерацию (foreach) по этому списку.
  • DOMNode->childNodes - Список узлов всех дочерних узлов узла. (Помните, что раздел CDATA является узлом!)
  • DOMNode->nodeType - Получите тип узла. Узлы CDATA имеют тип XML_CDATA_SECTION_NODE, который является константой со значением 4.
  • DOMNode->textContent - получите текстовое содержимое любого узла.

Примечание: Ваши разделы CDATA искажены. Я не знаю, почему в первом есть дополнительный ]] или незакрытый раздел CDATA на конец строки, но я думаю, что это должно быть просто:

<![CDATA[Aghia Paraskevi, Skiatos, Greece]]>

Собирая все это вместе, мы:

  1. Создайте новый объект документа и загрузите XML
  2. Получить все элементы Destination по имени тега и выполнить итерацию по списку
  3. Перебирать все дочерние узлы каждого элемента Destination
  4. Проверьте, является ли тип узла XML_CDATA_SECTION_NODE
  5. Если это так, echo textContent этого узел.

Код:

$doc = new DOMDocument();
$doc->load('test.xml');
$destinations = $doc->getElementsByTagName("Destination");
foreach ($destinations as $destination) {
    foreach($destination->childNodes as $child) {
        if ($child->nodeType == XML_CDATA_SECTION_NODE) {
            echo $child->textContent . "<br/>";
        }
    }
}

Результат:

Агия Параскеви, Скиатос, Греция
Аметтла, Испания
Амолиани, Греция
Боблинген, Германия

 30
Author: Nicole, 2011-08-05 16:21:58

Используйте это:

$parseFile = simplexml_load_file($myXML,'SimpleXMLElement', LIBXML_NOCDATA)

И далее:

foreach ($parseFile->yourNode as $node ){
etc...
}
 10
Author: Grzegorz Brzęczyszczykiewicz, 2014-01-21 22:37:56

Используйте replace CDATA перед анализом элемента PHP DOM, после чего вы можете получить InnerXml или innerHTML:

str_replace(array('<\![CDATA[',']]>'), '', $xml);
 3
Author: Brijesh Singh, 2012-07-19 11:30:25

Лучший и простой способ

$xml = simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOCDATA);
$xmlJson = json_encode($xml);
$xmlArr = json_decode($xmlJson, 1); // Returns associative array
 2
Author: Aniket Singh, 2016-08-03 18:41:12

Я использую следующий код. Он не только считывает все xml-данные с помощью

<![CDATA[values]] > 

Но также преобразуйте xml-объект в ассоциативный массив php. Таким образом, мы можем применить цикл к данным.

$xml_file_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA),true), true);

Надеюсь, это сработает для вас.

 1
Author: Adnan Ahmad, 2016-06-13 17:21:37