Дерево узлов обхода XML DOM
Обход означает обход или перемещение по дереву узлов.
Обход дерева узлов
Часто вы хотите зациклить XML-документ, например: когда вы хотите извлечь значение каждого элемента.
Это называется «Обход дерева узлов».
Пример ниже перебирает все дочерние узлы <book> и отображает их имена и значения:
Пример
<!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>
Вывод:
title: Everyday Italian
author: Giada De Laurentiis
year: 2005
Объяснение примера:
- Загрузите строку XML в xmlDoc
- Получить дочерние узлы корневого элемента
- Для каждого дочернего узла выведите имя узла и значение узла текстового узла.
Различия браузеров в парсинге DOM
Все современные браузеры поддерживают спецификацию W3C DOM.
Однако между браузерами есть некоторые различия. Одно важное отличие:
- То, как они обрабатывают пробелы и новые строки
DOM — пробелы и новые строки
XML часто содержит символы новой строки или пробелы между узлами. Это часто бывает, когда документ редактируется простым редактором, например Блокнотом.
Следующий пример (отредактированный Блокнотом) содержит CR/LF (новая строка) между каждой строкой и двумя пробелами перед каждым дочерним узлом:
<book>
<title>Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
Internet Explorer 9 и более ранние версии НЕ обрабатывают пустые пробелы или новые строки как текстовые узлы, в отличие от других браузеров.
В следующем примере выводится количество дочерних узлов, которые имеет корневой элемент ( books.xml ). IE9 и более ранние версии будут выводить 4 дочерних узла, тогда как IE10 и более поздние версии, а также другие браузеры будут выводить 9 дочерних узлов:
Пример
function myFunction(xml) {
var xmlDoc = xml.responseXML;
x =
xmlDoc.documentElement.childNodes;
document.getElementById("demo").innerHTML =
"Number
of child nodes: " + x.length;
}
PCDATA — проанализированные символьные данные
Синтаксические анализаторы XML обычно анализируют весь текст в XML-документе.
При анализе элемента XML также анализируется текст между тегами XML:
<message>This text is also parsed</message>
Синтаксический анализатор делает это, потому что элементы XML могут содержать другие элементы, как в этом примере, где элемент <name> содержит два других элемента (первый и последний):
<name><first>Bill</first><last>Gates</last></name>
и синтаксический анализатор разобьёт его на подэлементы следующим образом:
<name>
<first>Bill</first>
<last>Gates</last>
</name>
Проанализированные символьные данные (PCDATA) — это термин, используемый для текстовых данных, которые будут проанализированы синтаксическим анализатором XML.
CDATA - (необработанные) символьные данные
Термин CDATA используется для текстовых данных, которые не должны анализироваться синтаксическим анализатором XML.
Такие символы, как "<" и "&", недопустимы в элементах XML.
"<" вызовет ошибку, поскольку синтаксический анализатор интерпретирует его как начало нового элемента.
"&" вызовет ошибку, потому что синтаксический анализатор интерпретирует его как начало символьной сущности.
Некоторый текст, например код JavaScript, содержит много символов «<» или «&». Во избежание ошибок код скрипта можно определить как CDATA.
Все, что находится внутри раздела CDATA, анализатор игнорирует.
Раздел CDATA начинается с " <![CDATA[ " и заканчивается " ]]> ":
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0)
{
return 1;
} else
{
return 0;
}
}
]]>
</script>
В приведенном выше примере все содержимое раздела CDATA игнорируется синтаксическим анализатором.
Примечания к разделам CDATA:
Раздел CDATA не может содержать строку "]]>". Вложенные разделы CDATA не допускаются.
Символ «]]>», обозначающий конец раздела CDATA, не может содержать пробелов или разрывов строк.