simple_html_dom - PHP DOM textContent vs nodeValue?
simple_html_dom() (5)
Espero que esto tenga sentido:
$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);
Salida:
string(15) "old contenttest"
NULL
string(15) "old contenttest"
string(15) "old contenttest"
Porque: nodeValue
Los objetos PHP DOMnode contienen los atributos textContent y nodeValue que parecen ser el innerHTML del nodo.
nodeValue: el valor de este nodo, dependiendo de su tipo
textContent: este atributo devuelve el contenido de texto de este nodo y sus descendientes.
¿Cuál es la diferencia entre estas dos propiedades? ¿Cuándo es apropiado usar uno en lugar del otro?
Finalmente, también quería saber la diferencia, así que busqué en la source y encontré la respuesta; en la mayoría de los casos no habrá una diferencia perceptible, pero hay un montón de casos extremos que debe tener en cuenta.
Ambos ->nodeValue
y ->textContent
son idénticos para las siguientes clases (tipos de nodos):
La propiedad ->nodeValue
proporciona NULL
para las siguientes clases (tipos de nodos):
La propiedad ->textContent
no existe para las siguientes clases:
-
DOMNameSpaceNode
(no documentado, pero se puede encontrar con//namespace:*
selector)
La propiedad ->nodeValue
no existe para las siguientes clases:
Ver también: dom_node_node_value_read()
y dom_node_text_content_read()
Si desea asignar un valor a la propiedad textContent
, tenga en cuenta que no funciona para PHP <5.6.1 . Considere usar nodeValue
en nodeValue
lugar, para compatibilidad con versiones anteriores.
Son lo mismo. (NULL de mikespook es de un DOMNode no DOM)
Tanto textContent
como nodeValue
devuelven texto no nodeValue
; es decir, <
se convierte en <
.
textContent
concatena todo el contenido de todos los elementos textContent
. Esta es una distinción importante; por ejemplo, en Chrome, la longitud máxima de nodeValue
es 65536 caracteres (no bytes); si ya ha configurado el contenido de un nodo en algo más largo que eso, deberá iterar nodos secundarios si desea usar nodeValue
mientras que textContent
realizará la concatenación por usted.
Como se discutió, también hay varias clases de DOM que no son compatibles con nodeValue
pero que son compatibles con textContent
.
nodeValue
es más rápido por razones obvias; sin embargo, no lo use a menos que sepa exactamente cuál es realmente la estructura del nodo.