XML DOM - Доступ к узлам

При помощи DOM вы можете получить доступ к каждому узлу в XML-документе.

Получить доступ к узлу можно тремя способами:

  1. Используя метод getElementsByTagName()
  2. Путем перебора (обхода) дерева узлов
  3. Путем обхода дерева узлов, используя отношения между узлами.

Метод getElementsByTagName()

Метод getElementsByTagName() возвращает все элементы с указанным именем тега.

Синтаксис:


узел.getElementsByTagName("имя_тега");

В следующем примере возвращаются все элементы <title>, содержащиеся в элементе x:


x.getElementsByTagName("title");

Обратите внимание, что приведенный выше пример возвращает только те элементы <title>, которые находятся внутри узла x. Чтобы получить все элементы <title>, находящиеся в XML-документе, следует использовать:


xmlDoc.getElementsByTagName("title");

где xmlDoc - это сам документ (узел документа).

Список узлов DOM

Метод getElementsByTagName() возвращает список узлов. Список узлов - это массив узлов.


x = xmlDoc.getElementsByTagName("title");

Доступ к элементам <title> в узле x можно получить по номеру индекса. Для доступа к третьему <title> можно написать:


y = x[2];

Внимание! Нумерация индексов начинается с 0.

Подробнее о списках узлов будет рассказано в следующей главе этого руководства.

Длина списка узлов DOM

Свойство length определяет длину списка узлов (количество узлов).

Используя свойство length, можно пройтись по всему списку узлов:


var x = xmlDoc.getElementsByTagName("title");

for (i = 0; i < x.length; i++) {
  // что-то делаем с каждым узлом
}

Типы узлов

Свойство documentElement XML-документа содержит корневой узел.

Свойство nodeName узла содержит имя узла.

Свойство nodeType узла содержит тип узла.

Подробнее о свойствах узла будет рассказано в следующей главе этого руководства.

Обход узлов

В следующем примере мы в цикле обходим дочерние узлы корневого узла, которые также являются узлами-элементами:


txt = "";
x = xmlDoc.documentElement.childNodes;

for (i = 0; i < x.length; i++) {
  // Обрабатываем только узлы элементов (тип 1)
  if (x[i].nodeType == 1) {
    txt += x[i].nodeName + "<br>";
  }
}

Объяснение примера:

  1. Предположим, вы загрузили файл books.xml в xmlDoc
  2. Получаем дочерние узлы корневого элемента (xmlDoc)
  3. Для каждого дочернего узла проверяем тип узла. Если тип узла "1", это узел элемента.
  4. Выводим имя узла, если это узел элемента

Перемещаемся по узлам, используя отношения между ними

В следующем примере мы в цикле обходим дерево узлов, используя отношения между узлами:


x = xmlDoc.getElementsByTagName("book")[0];
xlen = x.childNodes.length;
y = x.firstChild;

txt = "";
for (i = 0; i < x len; i++) {
  // Обрабатываем только узлы элементов (тип 1)
  if (y.nodeType == 1) {
    txt += y.nodeName + "<br>";
  }
  y = y.nextSibling;
}

Объяснение примера:

  1. Предположим, вы загрузили файл books.xml в xmlDoc
  2. Получаем дочерние узлы первого элемента book
  3. Поместим в переменную "y" первый дочерний узел первого элемента book.
  4. Для каждого дочернего узла (начиная с первого дочернего узла в переменной "y"):
    1. Проверяем тип узла. Если тип узла "1", это узел элемента.
    2. Выводим имя узла, если это узел элемента
    3. Помещаем в переменную "y" следующего одноуровневый узел и снова выполняем цикл.