Как получить значения внутри с помощью 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>
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]]>
Собирая все это вместе, мы:
- Создайте новый объект документа и загрузите XML
- Получить все элементы
Destination
по имени тега и выполнить итерацию по списку - Перебирать все дочерние узлы каждого элемента
Destination
- Проверьте, является ли тип узла
XML_CDATA_SECTION_NODE
- Если это так,
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...
}
Используйте replace CDATA перед анализом элемента PHP DOM, после чего вы можете получить InnerXml или innerHTML:
str_replace(array('<\![CDATA[',']]>'), '', $xml);
Лучший и простой способ
$xml = simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOCDATA);
$xmlJson = json_encode($xml);
$xmlArr = json_decode($xmlJson, 1); // Returns associative array
Я использую следующий код. Он не только считывает все xml-данные с помощью
<![CDATA[values]] >
Но также преобразуйте xml-объект в ассоциативный массив php. Таким образом, мы можем применить цикл к данным.
$xml_file_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA),true), true);
Надеюсь, это сработает для вас.