web-dev-qa-db-fra.com

PHP DOM textContent vs nodeValue?

Les objets PHP DOMnode contiennent les attributs textContent et nodeValue qui semblent tous deux être le HHTML interne du nœud.

nodeValue: la valeur de ce nœud, selon son type

textContent: cet attribut renvoie le contenu textuel de ce nœud et de ses descendants.

Quelle est la différence entre ces deux propriétés? Quand est-il approprié d'utiliser l'un au lieu de l'autre?

41
Xeoncross

Je voulais enfin connaître la différence aussi, alors j'ai creusé dans le source et trouvé la réponse; dans la plupart des cas, il n'y aura pas de différence perceptible, mais il y a un tas de cas Edge que vous devez connaître.

->nodeValue Et ->textContent Sont identiques pour les classes suivantes (types de nœuds):

La propriété ->nodeValue Donne NULL pour les classes suivantes (types de nœuds):

La propriété ->textContent Est inexistante pour les classes suivantes:

  • DOMNameSpaceNode (non documenté, mais peut être trouvé avec le sélecteur //namespace:*)

La propriété ->nodeValue Est inexistante pour les classes suivantes:

Voir aussi: dom_node_node_value_read() et dom_node_text_content_read()

42
Ja͢ck

J'espère que cela aura du sens:

$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);

Production:

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

Parce que: nodeValue - La valeur de ce nœud, selon son type

16
mikespook

textContent et nodeValue renvoient du texte non échappé; c'est à dire. &lt; devient <.

textContent concatène ensemble tout le contenu de tous les enfants. Cette distinction est importante; par exemple, dans Chrome la longueur maximale de nodeValue est de 65536 caractères (pas d'octets); si vous avez déjà défini le contenu d'un nœud sur quelque chose de plus long que celui dont vous aurez besoin pour itérer les nœuds enfants si vous souhaitez utiliser nodeValue tandis que textContent effectuera la concaténation pour vous.

Comme indiqué, il existe également plusieurs classes DOM qui ne prennent pas en charge nodeValue mais prennent en charge textContent.

nodeValue est plus rapide pour des raisons évidentes; cependant, ne l'utilisez que si vous savez exactement quelle est la structure du nœud.

4
Adam Leggett

Si vous souhaitez affecter une valeur à la propriété textContent, notez que cela ne fonctionne pas pour PHP <5.6.1 . Pensez à utiliser nodeValue à la place, pour des raisons de compatibilité descendante.

0
Valerio Bozz