получение текстового содержимого определенного DOMElement

#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"