Esplorazione dell'albero dei nodi del DOM XML

Esplorazione (Traverse) significa esplorare l'albero dei nodi.

Esplorazione dell'albero dei nodi

Spesso hai bisogno di iterare un documento XML, ad esempio: quando vuoi estrarre il valore di ogni elemento.

Questo processo si chiama 'esplorazione dell'albero dei nodi'

Esempio di esempio che itera tutti i sottoelementi di <book> e visualizza i loro nomi e valori:

Esempio

<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var x, i ,xmlDoc;
var txt = "";
var text = "<book>" +
"<title>雅舍谈吃</title>" +
"<author>梁实秋</author>" +
"<year>2013</year>" +
"</book>";
parser = new DOMParser();
xmlDoc = parser.parseFromString(text,"text/xml");
// documentElement rappresenta sempre il nodo radice
x = xmlDoc.documentElement.childNodes;
for (i = 0; i < x.length ;i++) {
    txt += x[i].nodeName + ": " + x[i].childNodes[0].nodeValue + "<br>";
}
document.getElementById("demo").innerHTML = txt;
</script>
</body>
</html>

Prova personalmente

Esempio di spiegazione:

  1. Carica una stringa XML in xmlDoc In
  2. Ottieni i nodi figli dell'elemento radice
  3. Esempio: outputta il nome di ogni nodo figlio e il valore del nodo di testo

Differenze nei browser nella解析 DOM

Tutti i browser moderni supportano la specifica W3C DOM.

Ma ci sono alcune differenze tra i browser.

Il modo in cui li gestiscono

DOM - Spazi bianchi e nuove linee

L'XML di solito contiene caratteri di nuova riga o spazi bianchi tra i nodi. Questo avviene spesso quando si modificano documenti con editor semplici come Blocco Note.

Esempio seguente (modificato con Blocco Note) contiene CR/LF (caratteri di nuova riga) tra ogni riga e due spazi prima di ogni nodo figlio:

<book>
  <title>雅舍谈吃</title>
  <author>梁实秋</author>
  <press>江苏文艺出版社</press>
  <year>2013</year>
  <price>35</price>
  <ISBN>9787539962771</ISBN>
</book>

Internet Explorer 9 e le versioni precedenti non considerano spazi bianchi o nuove linee come nodi di testo, mentre altri browser lo fanno.

Esempio seguente mostrerà il numero di nodi figli dell'elemento radice (books.xml). Le versioni di IE9 e precedenti ne mostreranno 6 nodi figli, mentre le versioni di IE10 e successive e altri browser ne mostreranno 9 nodi figli:

Esempio

function myFunction(xml) {
var xmlDoc = xml.responseXML;
    x = xmlDoc.documentElement.childNodes;
    document.getElementById("demo").innerHTML =
    "Numero di nodi figli: " + x.length;
}

Prova personalmente

PCDATA - Dati di carattere解析 (Parsed Character Data)

Il parser XML di solito解析 tutti i testi nel documento XML.

Quando si解析 XML elementi, viene anche解析 il testo tra i tag XML:

<message>Questo testo verrà anche解析</message>

Il parser esegue questa operazione perché gli elementi XML possono contenere altri elementi, come nel presente esempio, dove l'elemento <name> contiene altri due elementi (first e last):

<name><first>Bill</first><last>Gates</last></name>

Il parser lo decomprime nei seguenti sottoelementi:

<name>
  <first>Bill</first>
  <last>Gates</last>
</name>

Il termine "解析字符数据" (PCDATA) viene utilizzato per descrivere i dati di testo che saranno解析 dal parser XML.

CDATA - Dati di carattere non解析 (Unparsed Character Data)

Il termine CDATA viene utilizzato per descrivere i dati di testo che non dovrebbero essere解析 dal parser XML.

"<" e "&I caratteri " in un elemento XML sono illegali.

"<" Genera un errore perché il parser lo interpreta come l'inizio di un nuovo elemento.

"&" Genera un errore perché il parser lo interpreta come l'inizio di un'entità di carattere.

Alcuni testi (ad esempio codice JavaScript) contengono una grande quantità di "<" o "&" Carattere. Per evitare errori, è possibile definire il codice dello script come CDATA.

Tutti i contenuti all'interno della parte CDATA vengono ignorati dal parser.

" Parte CDATA con "<![CDATA[" Inizio, con "]]>" Fine:

<script>
<![CDATA[
function matchwo(a,b) {
    if (a < b && a < 0) {
        return 1;
    else {
        return 0;
    }
}
]]>
</script>

在上面的示例中,解析器会忽略 CDATA 部分内的所有内容。

关于 CDATA 部分的注意事项:

CDATA 部分不能包含字符串 "]]>"。不允许嵌套 CDATA 部分。

标记 CDATA 部分结尾的 "]]>" 不能包含空格或换行符。