Drzewo węzłów przechodzenia XML DOM
Przechodzenie oznacza pętlę lub podróżowanie po drzewie węzłów.
Przemierzanie drzewa węzłów
Często chcesz zapętlić dokument XML, na przykład: gdy chcesz wyodrębnić wartość każdego elementu.
Nazywa się to „Przechodzeniem po drzewie węzłów”
Poniższy przykład przechodzi przez wszystkie węzły podrzędne <book> i wyświetla ich nazwy i wartości:
Przykład
<!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>
Wyjście:
title: Everyday Italian
author: Giada De Laurentiis
year: 2005
Przykład wyjaśniony:
- Załaduj ciąg XML do xmlDoc
- Pobierz węzły potomne elementu głównego
- Dla każdego węzła podrzędnego wypisz nazwę węzła i wartość węzła węzła tekstowego
Różnice przeglądarek w analizie DOM
Wszystkie nowoczesne przeglądarki obsługują specyfikację W3C DOM.
Istnieją jednak pewne różnice między przeglądarkami. Jedna ważna różnica to:
- Sposób, w jaki radzą sobie z białymi znakami i nowymi liniami
DOM - Białe przestrzenie i nowe linie
XML często zawiera nowe wiersze lub znaki odstępu między węzłami. Dzieje się tak często, gdy dokument jest edytowany za pomocą prostego edytora, takiego jak Notatnik.
Poniższy przykład (edytowany przez Notatnik) zawiera CR/LF (nowa linia) między każdą linią i dwiema spacjami przed każdym węzłem podrzędnym:
<book>
<title>Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
Internet Explorer 9 i starsze wersje NIE traktują pustych spacji ani nowych wierszy jako węzłów tekstowych, podczas gdy inne przeglądarki to robią.
Poniższy przykład wyświetli liczbę węzłów podrzędnych, które ma element główny ( books.xml ). IE9 i starsze wersje wygenerują 4 węzły podrzędne, podczas gdy IE10 i nowsze wersje oraz inne przeglądarki wygenerują 9 węzłów podrzędnych:
Przykład
function myFunction(xml) {
var xmlDoc = xml.responseXML;
x =
xmlDoc.documentElement.childNodes;
document.getElementById("demo").innerHTML =
"Number
of child nodes: " + x.length;
}
PCDATA — przeanalizowane dane znakowe
Parsery XML zwykle analizują cały tekst w dokumencie XML.
Podczas analizowania elementu XML analizowany jest również tekst między znacznikami XML:
<message>This text is also parsed</message>
Parser robi to, ponieważ elementy XML mogą zawierać inne elementy, jak w tym przykładzie, gdzie element <name> zawiera dwa inne elementy (pierwszy i ostatni):
<name><first>Bill</first><last>Gates</last></name>
a parser podzieli go na podelementy w ten sposób:
<name>
<first>Bill</first>
<last>Gates</last>
</name>
Parsed Character Data (PCDATA) to termin używany w odniesieniu do danych tekstowych, które będą analizowane przez parser XML.
CDATA — (nieprzeanalizowane) dane znakowe
Termin CDATA jest używany w odniesieniu do danych tekstowych, które nie powinny być analizowane przez parser XML.
Znaki takie jak „<” i „&” są niedozwolone w elementach XML.
"<" wygeneruje błąd, ponieważ parser zinterpretuje go jako początek nowego elementu.
„&” wygeneruje błąd, ponieważ parser zinterpretuje go jako początek encji znakowej.
Niektóre teksty, takie jak kod JavaScript, zawierają dużo znaków „<” lub „&”. Aby uniknąć błędów, kod skryptu można zdefiniować jako CDATA.
Wszystko w sekcji CDATA jest ignorowane przez parser.
Sekcja CDATA zaczyna się od „ <![CDATA[ ” i kończy się na „ ]]> ”:
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0)
{
return 1;
} else
{
return 0;
}
}
]]>
</script>
W powyższym przykładzie wszystko w sekcji CDATA jest ignorowane przez parser.
Uwagi dotyczące sekcji CDATA:
Sekcja CDATA nie może zawierać ciągu „]]>”. Zagnieżdżone sekcje CDATA są niedozwolone.
Znak „]]>” oznaczający koniec sekcji CDATA nie może zawierać spacji ani podziałów wierszy.