Подтвердить что ты не робот

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

Как я могу получить значения внутри <! [CDATA [values]] > используя 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>
4b9b3361

Ответ 1

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

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

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

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

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

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

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

Соединяя это все вместе:

  • Создайте новый объект документа и загрузите XML
  • Получить все Destination элементы по имени тега и перебрать по списку
  • Итерации по всем дочерним узлам каждого элемента Destination
  • Проверьте, что тип node XML_CDATA_SECTION_NODE
  • Если это так, echo textContent этого node.

Код:

$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/>";
        }
    }
}

Результат:

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

Ответ 2

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

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

и далее:

foreach ($parseFile->yourNode as $node ){
etc...
}

Ответ 3

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

str_replace(array('<\![CDATA[',']]>'), '', $xml);

Ответ 4

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

<![CDATA[values]] > 

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

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

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

Ответ 5

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

$xml = simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOCDATA);
$xmlJson = json_encode($xml);
$xmlArr = json_decode($xmlJson, 1); // Returns associative array