XML DOM gennemgår nodetræet

Gennemgå (Traverse) betyder at gennemgå nodetræet.

Gennemgå nodetræet

Du har ofte brug for at gennemgå XML-dokumenter, f.eks. når du vil udtrække værdierne for hver element.

Dette proces kaldes “gennemgå nodetræet”

Dette eksempel gennemgår alle underknuder af <book> og viser deres navne og værdier:

Eksempel

<!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 repræsenterer altid roden
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>

Prøv det selv

Eksempel på forklaring:

  1. Lad XML-strengen indlæses til xmlDoc i
  2. Få rodenhedets underknuder
  3. Output navnet på hver underknude samt værdien af dens tekstknude

Forskelle i DOM-parsning mellem browsere

Alle moderne browsere understøtter W3C DOM-standarden.

Men der er nogle forskelle mellem browsere.

Hvordan de håndterer tom plads og linjeskift

DOM - tom plads og linjeskift

XML inkluderer normalt linjeskift eller blanke tegn mellem knuder. Når dokumenter redigeres med enkle redigeringsredskaber som Notepad, opstår dette ofte.

Dette eksempel (redigeret i Notepad) indeholder CR/LF (linjeskift) mellem hver linje og to mellemrum foran hver underknude:

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

Internet Explorer 9 og tidligere versioner vil ikke betragte tom plads eller nye linjer som tekstknuder, mens andre browsere gør det.

Dette eksempel vil outputte antallet af underknuder (books.xml). IE9 og tidligere versioner vil outputte 6 underknuder, mens IE10 og senere versioner samt andre browsere vil outputte 9 underknuder:

Eksempel

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

Prøv det selv

PCDATA - Parsede tegndata (Parsed Character Data)

En XML-parser parser normalt alle tekster i et XML-dokument.

Når XML-elementer parses, parses parseren også teksten mellem XML-mærkerne:

<message>Dette tekst også vil blive parsed</message>

Parseren udfører denne operation, fordi XML-elementer kan indeholde andre elementer, som i dette eksempel, hvor <name>-elementet indeholder to andre elementer (first og last):

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

Parseren vil bryde det ned i følgende underelementer:

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

“Parsing af tegndata” (PCDATA) er et begreb, der bruges til at beskrive tekstdata, der skal parses af XML-parseren.

CDATA - Uoparslet tegndata (Unparsed Character Data)

Terminen CDATA bruges til at beskrive tekstdata, der ikke skal parses af XML-parseren.

"<" og "&" og andre tegn er ulovlige i XML-elementer.

"<" vil generere en fejl, fordi parseren fortolker det som begyndelsen på et nyt element.

"&" vil generere en fejl, fordi parseren fortolker det som begyndelsen på en tegnentity.

Visse tekster (f.eks. JavaScript-kode) indeholder en stor mængde "<" eller "&"-tegnene. For at undgå fejl kan skriptkoden defineres som CDATA.

CDATA-sektionens indhold vil blive ignoreret af parseren.

CDATA-sektionen med "<![CDATA[" Begyndelse, med "" Kan ikke indeholde CDATA-sektioner i skjul" Afslutning: "

<script>
<![CDATA[
function matchwo(a,b) {
    if (a < b && a < 0) {
        return 1;
    else {
        return 0;
    return 0;
return 0;
" Kan ikke indeholde CDATA-sektioner i skjul
}

</script>

I de ovennævnte eksempler vil analyseren ignorere alt indhold inden for CDATA-sektionen.

Bemærkninger om CDATA-sektioner:" Kan ikke indeholde CDATA-sektioner i skjulCDATA-sektioner kan ikke indeholde strengen "

". CDATA-sektioner kan ikke være indlejret." Kan ikke indeholde CDATA-sektioner i skjul]]>