Программная обработка XML документов с помощью XML DOM
Перемещение между узлами дерева
В XML DOM отношения между узлами определены в виде следующих свойств узлов:
Характер отношений между узлами представлен на следующем рисунке:
Игнорирование пустых текстовых узлов
Firefox и некоторые другие браузеры воспринимают неотображаемые символы как текстовые узлы (в отличие от Internet Explorer). Такая ситуация приводит к проблемам при использовании свойств firstChild, lastChild, nextSibling, previousSibling. Для того, чтобы игнорировать такие пустые текстовые узлы можно использовать следующий прием:
function get_nextSibling(n) { y = n.nextSibling; while (y.nodeType!=1) { y = y.nextSibling; } return y; }
Поскольку узлы элементов имеют тип 1, то в том случае, когда узел-потомок не является узлом элемента, будет происходить перемещение к следующему узлу до тех пор, пока не будет найден узел элемента.
Изменение значения атрибута
Узлы атрибутов могут принимать текстовые значения. Изменение этого значения реализуется либо через метод setAttribute(), либо через свойство узла атрибута nodeValue
Метод setAttribute() изменяет значение существующего атрибута или создает новый атрибут.
Например:
xmlDoc = loadXMLDoc("timetable.xml"); x = xmlDoc.getElementsByTagName('lesson'); x[0].setAttribute("type","lab");
Свойство nodeValue можно использовать для изменения значения атрибута узла:
xmlDoc = loadXMLDoc("timetable.xml"); x = xmlDoc.getElementsByTagName("lesson")[0]; y = x.getAttributeNode("type"); y.nodeValue = "lab";
Удаление узла из дерева реализуется с помощью метода removeChild():
xmlDoc=loadXMLDoc("timetable.xml "); y=xmlDoc.getElementsByTagName("lesson")[0]; xmlDoc.documentElement.removeChild(y);
Свойства объекта Node
IE: Internet Explorer, F: Firefox, O: Opera, W3C: (Стандарт)
Методы объекта Node
Метод | Описание | IE | F | O | W3C |
---|---|---|---|---|---|
appendChild() | Добавить новый узел в конец списка дочерних узлов | 5 | 1 | 9 | Да |
cloneNode() | Клонирование узла | 5 | 1 | 9 | Да |
compareDocumentPosition() | Сравнение позиций двух узлов | Нет | 1 | Нет | Да |
getFeature(feature,version) | Возвращает объект DOM, реализующий специализированный API | Нет | Да | ||
getUserData(key) | Возвращает объект, ассоциирующийся с ключем текущего узла. Перед этим объект должен быть ассоциирован с текущим узлом путем вызова setUserData с тем же ключем | Нет | Да | ||
hasAttributes() | Возвращает истинное значение, если узел имеет атрибуты | Нет | 1 | 9 | Да |
hasChildNodes() | Возвращает истинное значение, если узел имеет дочерние узлы | 5 | 1 | 9 | Да |
insertBefore() | Вставляет новый узел перед существующим узлом | 5 | 1 | 9 | Да |
isDefaultNamespace(URI) | Определяет, является ли указанный namespaceURI значением по умолчанию | Нет | Да | ||
isEqualNode() | Проверяет равенство двух узлов | Нет | Нет | Нет | Да |
isSameNode() | Проверяет идентичность двух уздов | Нет | 1 | Нет | Да |
isSupported(feature,version) | Определяет поддерживается ли указанная характеристика узлом | 9 | Да | ||
removeChild() | Удаляет дочерний узел | 5 | 1 | 9 | Да |
replaceChild() | Заменяет дочерний узел | 5 | 1 | 9 | Да |
setUserData(key,data,handler) | Ассоциирует объект с ключем в узле | Нет | Да |