XML DOM Traverse Node Tree
Deurkruis beteken om deur die nodusboom te loop of oor die knoopboom te beweeg.
Deur die Node-boom
Dikwels wil jy 'n XML-dokument lus maak, byvoorbeeld: wanneer jy die waarde van elke element wil onttrek.
Dit word genoem "Die knoopboom deurkruis"
Die voorbeeld hieronder loop deur alle kindernodusse van <boek>, en vertoon hul name en waardes:
Voorbeeld
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var x, i ,xmlDoc;
var txt = "";
var text = "<book>" +
"<title>Everyday Italian</title>" +
"<author>Giada De Laurentiis</author>" +
"<year>2005</year>" +
"</book>";
parser = new DOMParser();
xmlDoc
= parser.parseFromString(text,"text/xml");
// documentElement always
represents the root node
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>
Uitset:
title: Everyday Italian
author: Giada De Laurentiis
year: 2005
Voorbeeld verduidelik:
- Laai die XML-string in xmlDoc
- Kry die kind nodusse van die wortel element
- Vir elke kindnodus, voer die nodusnaam en die noduswaarde van die teksnodus uit
Blaaierverskille in DOM-ontleding
Alle moderne blaaiers ondersteun die W3C DOM-spesifikasie.
Daar is egter 'n paar verskille tussen blaaiers. Een belangrike verskil is:
- Die manier waarop hulle wit spasies en nuwe lyne hanteer
DOM - Wit spasies en nuwe lyne
XML bevat dikwels nuwe lyn, of wit spasie karakters, tussen nodusse. Dit is dikwels die geval wanneer die dokument deur 'n eenvoudige redigeerder soos Notepad geredigeer word.
Die volgende voorbeeld (geredigeer deur Notepad) bevat CR/LF (nuwe reël) tussen elke reël en twee spasies voor elke kindnodus:
<book>
<title>Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
Internet Explorer 9 en vroeër behandel NIE leë wit spasies of nuwe reëls as teksnodes nie, terwyl ander blaaiers dit doen.
Die volgende voorbeeld sal die aantal kind nodusse afvoer wat die wortelelement (van books.xml ) het. IE9 en vroeër sal 4 kind nodusse uitvoer, terwyl IE10 en later weergawes, en ander blaaiers 9 kinder nodusse sal uitvoer:
Voorbeeld
function myFunction(xml) {
var xmlDoc = xml.responseXML;
x =
xmlDoc.documentElement.childNodes;
document.getElementById("demo").innerHTML =
"Number
of child nodes: " + x.length;
}
PCDATA - Ontleed karakterdata
XML-ontleders ontleed gewoonlik al die teks in 'n XML-dokument.
Wanneer 'n XML-element ontleed word, word die teks tussen die XML-merkers ook ontleed:
<message>This text is also parsed</message>
Die ontleder doen dit omdat XML-elemente ander elemente kan bevat, soos in hierdie voorbeeld, waar die <naam>-element twee ander elemente (eerste en laaste) bevat:
<name><first>Bill</first><last>Gates</last></name>
en die ontleder sal dit opbreek in sub-elemente soos hierdie:
<name>
<first>Bill</first>
<last>Gates</last>
</name>
Ontledde karakterdata (PCDATA) is 'n term wat gebruik word oor teksdata wat deur die XML-ontleder ontleed sal word.
CDATA - (Ongeparseerde) Karakterdata
Die term CDATA word gebruik oor teksdata wat nie deur die XML-ontleder ontleed moet word nie.
Karakters soos "<" en "&" is onwettig in XML-elemente.
"<" sal 'n fout genereer omdat die ontleder dit interpreteer as die begin van 'n nuwe element.
"&" sal 'n fout genereer omdat die ontleder dit interpreteer as die begin van 'n karakterentiteit.
Sommige teks, soos JavaScript-kode, bevat baie "<" of "&" karakters. Om foute te vermy, kan script-kode as CDATA gedefinieer word.
Alles binne 'n CDATA-afdeling word deur die ontleder geïgnoreer.
'n CDATA-afdeling begin met " <![CDATA[ " en eindig met " ]]> ":
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0)
{
return 1;
} else
{
return 0;
}
}
]]>
</script>
In die voorbeeld hierbo word alles binne die CDATA-afdeling deur die ontleder geïgnoreer.
Notas oor CDATA-afdelings:
'n CDATA-afdeling kan nie die string "]]> bevat nie. Geneste CDATA-afdelings word nie toegelaat nie.
Die "]]>" wat die einde van die CDATA-afdeling aandui, kan nie spasies of lynbreuke bevat nie.