Intereting Posts
Загрузка файла PHP: подтверждение на mime или расширение? ROS catkin_init_workspace не найден, когда порожден как процесс PHP AES шифрует в терминале и расшифровывает в PHP Как получить доступ к нескольким свойствам с помощью магического метода (__ get & __set)? Новичок имеет проблемы с загрузкой файла с помощью ASIHTTPRequest Количество число тегов <li> в <ul> на сервере с использованием PHP Финал: AJAX / jQuery / PHP Форма представления и модальная коробка открываются с успехом Операторы PDO автоматически экранируются? Что такое флагов PHP в аргументах функции? RewriteRule htaccess всегда удаляет конечную директорию с косой чертой Простейшая версия ajax (jQuery) для загрузки только одного файла Анализ CSS по регулярному выражению Объединение двух различных размерных массивов PHP Обновление php mysql IP-адреса не может работать правильно Как переопределить массив конфигурации в контроллере в CodeIgniter?

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

Я пытаюсь получить значение (текст) конкретного узла из XML-документа, используя классы php DOM, но я не могу сделать это правильно, потому что получаю текстовое содержимое этого узла, объединенного с его потомками.

Предположим, что мне нужно получить деревья из этого документа:

<?xml version="1.0"?> <trees> LarchRedwoodChestnutBirch <trimmed>Larch</trimmed> <trimmed>Redwood</trimmed> </trees> 

И я получаю:

 LarchRedwoodChestnutBirchLarchRedwood 

Вы можете видеть, что я не могу удалить подстроку LarchRedwood, сделанную обрезанными деревьями из всего текста, потому что я бы получил только ChestnutBirch, и это не то, что мне нужно.

Вы предлагаете? (Thanx)

Я понял. Это работает:

 function specificNodeValue($node, $implode = true) { $value = array(); if ($node->childNodes) { for ($i = 0; $i < $node->childNodes->length; $i++) { if (!(@$node->childNodes->item($i)->tagName)) { $value[] = $node->childNodes->item($i)->nodeValue; } } } return (is_string($implode) ? implode($implode, $value) : ($implode === true ? implode($value) : $value)); } 

Данный узел подобен корню, если вы не получаете tagName при анализе своих дочерних узлов, то он сам по себе, поэтому значение этого дочернего узла является его собственным значением.
Внутри плохо сформированного XML-документа узел может иметь много частей значения, поместить их все в массив, чтобы получить все значение узла.
Используйте функцию выше, чтобы получить необходимое значение узла без значений вложенных значений.

Параметры:
$ node (обязательно) должен быть объектом DOMElement
$ implode (необязательно), если вы хотите получить строку (true по умолчанию) или массив (false), состоящий из множества значений. ( Задайте строку вместо логического значения, если вы хотите взорвать массив, используя строку «glue» ).

Вы можете попробовать это, чтобы удалить trimmed узел

 $doc = new DOMDocument('1.0', 'utf-8'); $doc->loadXML($xml); $xpath = new DOMXpath($doc); $trees = $doc->getElementsByTagName('trees')->item(0); foreach ($xpath->query('/trees/*') as $node) { $trees->removeChild($node); } echo $trees->textContent; echo $trees->nodeValue; 

Используйте $node->nodeValue чтобы получить текстовое содержимое узла. Если вы используете $node->textContent , вы получаете весь текст из текущего узла и всех дочерних узлов.

В идеале XML должен быть:

 <?xml version="1.0"?> <trees> <tree>Larch</tree> <tree>Redwood</tree> <tree>Chestnut</tree> <tree>Birch</tree> </trees> 

Чтобы разделить «LarchRedwoodChestnutBirch» на отдельные слова (заглавными буквами), вам понадобятся функции PHP «PCRE»:

http://www.php.net/manual/en/book.pcre.php

'Надеюсь, это поможет!