Как получить значения внутри <! [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.
Вот важные классы:
Существует несколько основных методов и свойств:
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]]>
Объединив все это, мы:
Destination
по имени тега и перебрать по списку Destination
XML_CDATA_SECTION_NODE
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