PHP DOM textContent vs nodeValue?

Объекты PHP DOMnode содержат атрибуты textContent и nodeValue, которые кажутся внутреннимHTML узла.

nodeValue: значение этого узла, в зависимости от его типа

textContent: этот атрибут возвращает текстовое содержимое этого узла и его потомков.

В чем разница между этими двумя свойствами? Когда правильно использовать один вместо другого?

Я, наконец, тоже хотел узнать эту разницу, поэтому я ворвался в источник и нашел ответ; в большинстве случаев не будет заметной разницы, но есть куча крайних случаев, о которых вы должны знать.

Оба ->nodeValue и ->textContent идентичны для следующих классов (типы узлов):

  • DOMAttr
  • DOMText
  • DOMElement
  • DOMComment
  • DOMCharacterData
  • DOMProcessingInstruction

Свойство ->nodeValue дает NULL для следующих классов (типы узлов):

  • DOMDocumentFragment
  • DOMDocument
  • DOMNotation
  • DOMEntity
  • DOMEntityReference

Свойство ->textContent не существует для следующих классов:

  • DOMNameSpaceNode (не документирован, но может быть найден с //namespace:* селектор)

Свойство ->nodeValue не существует для следующих классов:

  • DOMDocumentType

См. Также: dom_node_node_value_read() и dom_node_text_content_read()

Надеюсь, это будет иметь смысл:

 $doc = DOMDocument::loadXML('<body><!-- test --><node attr="test1">old content<h1>test</h1></node></body>'); var_dump($doc->textContent); var_dump($doc->nodeValue); var_dump($doc->firstChild->textContent); var_dump($doc->firstChild->nodeValue); 

Вывод:

 string(15) "old contenttest" NULL string(15) "old contenttest" string(15) "old contenttest" 

Потому что: nodeValue – значение этого узла, в зависимости от его типа

И textContent и nodeValue возвращают nodeValue текст; т.е. &lt; становится < .

textContent объединяет все содержимое всех детей. Это важное различие; например, в Chrome максимальная длина nodeValue составляет 65536 символов (а не байтов); если вы уже установили содержимое узла чем-то дольше, чем вам нужно будет перебирать дочерние узлы, если вы хотите использовать nodeValue тогда как textContent будет выполнять конкатенацию для вас.

Как обсуждалось, есть также несколько классов DOM, которые не поддерживают nodeValue но поддерживают textContent .

nodeValue быстрее по понятным причинам; однако не используйте его, если вы точно не знаете, что такое структура узла.

Если вы хотите присвоить значение textContent обратите внимание, что он не работает для PHP <5.6.1 . nodeValue этого рассмотрите возможность использования nodeValue для обратной совместимости.

Это одно и то же. (NULL от mikespook от не-DOMNode)