#php
#php
Вопрос:
После небольшой обработки я обнаружил, что DOMElement-> textContent также возвращает объединенный текст из дочерних элементов этого элемента.
Немного оглядевшись, я увидел, что люди предлагают DOMElement-> firstChild-> textContent, но для меня это не подходит, потому что я просматриваю документ, следуя иерархии и указаниям атрибутов элемента, данные с такой же вероятностью находятся на ветке, а не на листе, поэтому я получу несколько обращений, даже если только одно из них является правильным.
Есть ли реальный способ получить текстовое содержимое этого конкретного элемента и ни одного из его дочерних элементов?
РЕДАКТИРОВАТЬ: nvm, нашел способ убедиться
function get_text($el) {
if (is_a($el->firstChild, "DOMText")) return $el->firstChild->textContent;
return "";
}
Комментарии:
1. Должен быть способ. Не могли бы вы, пожалуйста, показать код, который вы используете, и строку?
Ответ №1:
Просто выполните итерацию дочерних узлов и проверьте, является ли следующий узел текстовым. Возможно, вы захотите пропустить узлы, состоящие только из пробелов, хотя:
function getNodeText(DOMNode $node) {
if ($node->nodeType === XML_TEXT_NODE)
return $node->textContent;
$node = $node->firstChild;
while ($node) {
if ($node->nodeType === XML_TEXT_NODE amp;amp;
$text = trim($node->textContent))
{
return $text;
}
$node = $node->nextSibling;
}
return '';
}
$xml = <<<'EOXML'
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child>
<x>x text</x>
child text
</child>
root text
</root>
EOXML;
$doc = new DOMDocument();
$doc->loadXML($xml);
var_dump(getNodeText($doc->getElementsByTagName('x')[0]));
var_dump(getNodeText($doc->getElementsByTagName('root')[0]));
var_dump(getNodeText($doc->getElementsByTagName('child')[0]));
Пример вывода
string(6) "x text"
string(9) "root text"
string(10) "child text"