2012-09-12 20 views
34

Gli oggetti PHP DOMnode contengono gli attributi textContent e nodeValue che sembrano entrambi il innerHTML del nodo.PHP DOM textContent vs nodeValue?

nodeValue: Il valore di questo nodo, a seconda del tipo

textContent: Questo attributo restituisce il contenuto di testo di questo nodo ei suoi discendenti.

Qual è la differenza tra queste due proprietà? Quando è opportuno usarne uno invece dell'altro?

risposta

36

Alla fine volevo anche sapere la differenza, quindi ho trovato lo source e ho trovato la risposta; nella maggior parte dei casi non ci sarà alcuna differenza visibile, ma ci sono un sacco di casi limite di cui dovresti essere a conoscenza.

Sia ->nodeValue e ->textContent sono identici per le seguenti classi (tipi di nodo):

I ->nodeValue rendimenti immobiliari NULL per le seguenti classi (tipi di nodo):

La struttura ->textContent è inesistente per le seguenti classi:

  • DOMNameSpaceNode (non documentato, ma può essere trovata con //namespace:* selettore)

La struttura ->nodeValue è inesistente per le seguenti classi:

Consulta anche: dom_node_node_value_read() e dom_node_text_content_read()

+1

Questa è una buona risposta, ma è la domanda sbagliata. – pguardiario

+1

@pguardiario Le prime 11 classi sono tutte discendenti di DOMNode e la domanda riguarda DOMNode, non è sicuro di quale sia la risposta sbagliata per la domanda. –

13

Spero che questo avrà senso:

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

uscita:

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

Perché: nodeValue - The value of this node, depending on its type

+0

Il nodoValore per un DOMDocument è NULL, quindi? – danidacar

-3

Sono la stessa cosa. (Il NULL di mikespook proviene da un non-DOMNode)

+0

No, DOMDocument è un discendente di DOMNode; l'implementazione del getter di proprietà definisce semplicemente il valore come NULL. –

+0

Eh? La domanda riguarda DOMNode, non DOMDocument. – pguardiario

+2

Sì, beh, DOMDocument è anche un DOMNode vero? Mi riferivo specificamente al commento fatto sulla risposta di Mike. –

0

Se si desidera assegnare un valore alla nota textContent proprietà che non funziona per PHP < 5.6.1. Considerare l'utilizzo di nodeValue invece, per la compatibilità con le versioni precedenti.

2

Entrambi textContent e nodeValue restituiscono testo senza escape; Ad esempio &lt; diventa <.

textContent concatena insieme tutti i contenuti di tutti i bambini. Questa è una distinzione importante; ad esempio, in Chrome la lunghezza massima di nodeValue è 65536 caratteri (non i byte); se il contenuto di un nodo è già stato impostato su un valore superiore a quello, sarà necessario iterare i nodi figlio se si desidera utilizzare nodeValue mentre textContent eseguirà la concatenazione per conto dell'utente.

Come discusso, ci sono anche diverse classi DOM che non supportano nodeValue ma supportano textContent.

nodeValue è più veloce per ovvi motivi; tuttavia non usarlo a meno che non si sappia esattamente quale sia la struttura del nodo.