Przeszukiwanie drzewa węzłów XML DOM

Przeszukiwanie (Traverse) oznacza przeszukiwanie drzewa węzłów.

Przeszukiwanie drzewa węzłów

Często będziesz musiał przechodzić przez dokument XML, np.: gdy chcesz wydobyć wartości każdego elementu.

Ten proces nazywa się „przeszukiwaniem drzewa węzłów”

Poniższy przykład przechodzi przez wszystkie podwęzły <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>雅舍谈吃</title>" +
"<author>梁实秋</author>" +
"<year>2013</year>" +
"</book>";
parser = new DOMParser();
xmlDoc = parser.parseFromString(text,"text/xml");
// documentElement zawsze reprezentuje węzeł główny
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>

Spróbuj sam!

Przykład wyjaśnienia:

  1. Załaduj ciąg XML do xmlDoc w
  2. Pobierz podwęzły elementu głównego
  3. Wyświetl nazwę każdego podwęzła oraz wartość węzła tekstowego

Różnice między przeglądarkami w解析acji DOM

Wszystkie współczesne przeglądarki wspierają specyfikację W3C DOM.

Ale istnieją pewne różnice między przeglądarkami.

Sposób, w jaki obsługują białe znaki i znaki nowej linii

DOM - białe znaki i znaki nowej linii

XML zazwyczaj zawiera znaki nowej linii lub białe znaki między węzłami. Kiedy dokument jest edytowany za pomocą prostych edytorów, takich jak Notatnik, często pojawia się to.

Poniższy przykład (edytowany w Notatniku) zawiera CR/LF (znak nowej linii) między每一行, i dwa spacje przed każdym podwęzłem:

<book>
  <title>Yashu Talk About Eating</title>
  <author>Liang Shiqiu</author>
  <press>Wydawnictwo Literackie Jiangsu</press>
  <year>2013</year>
  <price>35</price>
  <ISBN>9787539962771</ISBN>
</book>

Internet Explorer 9 i wcześniejsze wersje nie traktują białych znaków lub nowych linii jako węzłów tekstowych, podczas gdy inne przeglądarki robią to.

Poniższy przykład wyświetli liczbę podwęzłów elementu głównego (books.xml). Wersje IE9 i wcześniejsze będą wyświetlały 6 podwęzłów, podczas gdy wersje IE10 i nowsze oraz inne przeglądarki będą wyświetlały 9 podwęzłów:

Przykład

function myFunction(xml) {
var xmlDoc = xml.responseXML;
    x = xmlDoc.documentElement.childNodes;
    document.getElementById("demo").innerHTML =
    "Liczba podwęzłów: " + x.length;
}

Spróbuj sam!

PCDATA - Analizowane dane znakowe (Parsed Character Data)

Zwykle analizator XML analizuje wszystkie teksty w dokumencie XML.

Podczas analizowania elementów XML, również analizowane są teksty między znacznikami XML:

<message>Ten tekst również będzie analizowany</message>

Analizator wykonuje to działanie, ponieważ elementy XML mogą zawierać inne elementy, jak w tym przykładzie, gdzie element <name> zawiera dwa inne elementy (first i last):

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

Analizator rozkłada go na następujące podelementy:

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

“Analizowane dane znakowe” (PCDATA) to termin używany do opisania danych tekstowych, które będą analizowane przez analizator XML.

CDATA - Nienanalizowane dane znakowe (Unparsed Character Data)

Termin CDATA używany jest do opisania tekstu, który nie powinien być analizowany przez analizator XML.

"<" i "&" i inne znaki są niedozwolone w elementach XML.

"<" Generuje błąd, ponieważ analizator go interpretuje jako początek nowego elementu.

"&" Generuje błąd, ponieważ analizator go interpretuje jako początek entyty znakowej.

Niektóre teksty (np. kod JavaScript) zawierają dużą ilość "<" lub "&" Aby uniknąć błędów, można zdefiniować kod skryptu jako CDATA.

Wszystkie zawartości wewnętrzne części CDATA będą ignorowane przez analizator.

" Część CDATA z "<![CDATA[" Rozpoczęcie, z "]]>" Koniec:

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

W powyższym przykładzie, parser ignoruje wszystkie zawartości wewnątrz sekcji CDATA.

Uwagi dotyczące sekcji CDATA:

Sekcja CDATA nie może zawierać ciągu "]]>". Nie dozwolone wcięcia wewnątrz sekcji CDATA.

Markowanie końca sekcji CDATA "]]>" nie może zawierać spacji ani znaków nowej linii.