Как получить значения внутри <! ]> с помощью 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> 

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

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

  • DOMNode – базовый класс для всего, что можно перемещать внутри документа XML / HTML, включая текстовые узлы, узлы комментариев и узлы CDATA
  • DOMElement – базовый класс для тегов .
  • DOMDocument – базовый класс для документов. Содержит методы загрузки / сохранения 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. Если это так, textContent 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/>"; } } } 

Результат:

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

Использовать это:

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

и далее:

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

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

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

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

 <![CDATA[values]] > 

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

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

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

Лучший и легкий способ

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