XML DOM:n nodon puun läpikäynti

Läpikäynti (Traverse) tarkoittaa nodon puun läpikäymistä.

Nodojen puun läpikäynti

Tarvitset usein käydä läpi XML-dokumentteja, kuten: kun haluat poimia jokaisen elementin arvon.

Tämä prosessi kutsutaan 'nodojen puun läpikäymiseksi'

Tämä esimerkki käy läpi <book>-elementin kaikki lapsinodot ja näyttää niiden nimet ja arvot:

Esimerkki

!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 edustaa aina juurisolmua
x = xmlDoc.documentElement.childNodes;
for (i = 0; i < x.length ;i++) {
    txt += x[i].nodeName + ": " + x[i].childNodes[0].nodeValue + "<br>";
return 0;
document.getElementById("demo").innerHTML = txt;
}
</body>
</html>

Kokeile itse!

Esimerkki selitykseksi:

  1. Lataa XML-merkkijono xmlDoc
  2. Hae juurielementin alalehdet
  3. Tulosta jokaisen alalehden nimi sekä sen tekstinode:n arvo

Selaimien DOM-tulkinnan erot

Kaikki nykyaikaiset selaimet tukevat W3C DOM-standardeja.

Mutta selaimet eroavat toisistaan joissakin kohdissa. Yksi tärkeä ero on:

Miten ne käsittelevät tyhjiä ja rivinvaihtomerkkejä

DOM - tyhjät ja rivinvaihtomerkit

XML sisältää yleensä rivinvaihtomerkkejä tai välilyöntejä solmujen välillä. Tämä tapahtuu usein, kun dokumentteja muokataan yksinkertaisilla muokkausohjelmilla, kuten muistiinpanoilla.

Esimerkki (muokattu muistiinpanoilla) sisältää CR/LF (rivinvaihtomerkit) jokaisen rivin välillä ja kaksi välilyöntiä jokaisen alalehden edessä:

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

Internet Explorer 9 ja aikaisemmat versiot eivät pidä tyhjiä tai uusia rivejä tekstinodeina, kun taas muut selaimet tekevät niin.

Esimerkki näyttää juurielementin (books.xml) alalehdet. IE9 ja aikaisemmat versiot tulostavat 6 alalehteä, mutta IE10 ja uudet versiot sekä muut selaimet tulostavat 9 alalehteä:

Esimerkki

function myFunction(xml) {
var xmlDoc = xml.responseXML;
    x = xmlDoc.documentElement.childNodes;
    document.getElementById("demo").innerHTML =
    "Lapsisolujen määrä: " + x.length;
return 0;

Kokeile itse!

PCDATA - Analysoitu merkkidata (Parsed Character Data)

XML-analysoija analysoi yleensä kaikki tekstit XML-dokumentissa.

XML-elementtien analysoinnin yhteydessä analysoitaan myös XML-merkinnän välillä olevaa tekstiä:

<message>Tämä teksti myös analysoitaan</message>

Analysoija tekee tämän, koska XML-elementti voi sisältää muita elementtejä, kuten tässä esimerkissä, jossa <name>-elementti sisältää kaksi muuta elementtiä (first ja last):

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

Analysoija jakaa sen seuraaviin alielementteihin:

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

“Analysoitu merkkidata” (PCDATA) -termi käytetään kuvaamaan tekstidataa, jota XML-analysoija tulkitsee.

CDATA - Analysoimaton merkkidata (Unparsed Character Data)

Termi CDATA käytetään kuvaamaan tekstidataa, jota XML-analysoija ei tulkitse.

"<" ja "&" ja muut merkit ovat laillisia XML-elementissä.

"<" aiheuttaa virheen, koska analysoija tulkitsii sen uuden elementin alkuun.

"&" aiheuttaa virheen, koska analysoija tulkitsii sen merkkientiteen alkuun.

Jotkut tekstit (esim. JavaScript-koodi) sisältävät suuren määrän "<" tai "&" merkki. Väärän analysoinnin välttämiseksi voi määrittää skriptikoodin CDATAksi.

CDATA-osaan sisältyvä kaikki sisältö jätetään analysoimatta.

" CDATA-osa on merkitty "<![CDATA[" Aloitetaan, "" ei voi sisältää CDATA-osan loppua." Loppu:

<script>
<![CDATA[
function matchwo(a,b) {
    jos (a < b ja a < 0) {
        palauta 1;
    }
        return 0;
    return 0;
return 0;
" ei voi sisältää CDATA-osan loppua.
}

</script>

Yllä olevassa esimerkissä parseri ignoraali CDATA-osan kaikki sisällön.

Huomioita CDATA-osasta:" ei voi sisältää CDATA-osan loppua.CDATA-osa ei voi sisältää merkkijonoa "

" ei voi sisältää sisennettyjä CDATA-osia." ei voi sisältää CDATA-osan loppua.]]>