Опубликован: 04.07.2012 | Уровень: специалист | Доступ: платный
Лекция 9:

Введение в XML. Структура XML документа. Объектная модель DOM XML

Перемещение между узлами дерева

В XML DOM отношения между узлами определены в виде следующих свойств узлов:

  • parentNode
  • childNodes
  • firstChild
  • lastChild
  • nextSibling
  • previousSibling

Характер отношений между узлами представлен на следующем рисунке:


Игнорирование пустых текстовых узлов

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: (Стандарт)

Свойство Описание IE F O W3C
Версия
baseURI Возвращает абсолютный URI узла Нет 1 Нет Да
childNodes Возвращает свойство NodeList (список доч.узлов) 5 1 9 Да
firstChild Возвращает первый дочерний узел 5 1 9 Да
lastChild Возвращает последний дочерний узел 5 1 9 Да
localName Возвращает локальную часть имени узла Нет 1 9 Да
namespaceURI Возвращает URI узла в пространстве имен Нет 1 9 Да
nextSibling Возвращает следующий дочерний узел 5 1 9 Да
nodeName Возвращает имя узла в зависимости от типа 5 1 9 Да
nodeType Возвращает тип узла 5 1 9 Да
nodeValue Устанавливает или возвращает значение узла в зависимости от типа 5 1 9 Да
ownerDocument Возвращает корневой элемент (объект document) для узла 5 1 9 Да
parentNode Возвращает родительский узел 5 1 9 Да
prefix Устанавливает или возвращает префикс пространства имен узла Нет 1 9 Да
previousSibling Возвращает непосредственно предшествующий узел 5 1 9 Да
textContent Устанавливает или возвращает текстовое содержимое узла Нет 1 Нет Да
xml Возвращает XML код узла 5 Нет Нет Нет

Методы объекта 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) Ассоциирует объект с ключем в узле Нет Да

SAX парсер

Альтернативным интерфейсом для обработки XML документов является SAX.

SAX (Simple API for XML) - прикладной программный интерфейс для парсера с последовательным доступом к XML. Этот интерфейс предоставляет механизм чтения данных из XML документа.

SAX парсер является поточным и управляемым событиями. Задачей пользователя SAX API заключается в описании методов, вызываемых событиями, возникающими при анализе документа.

Такими событиями могут быть следующие:

  • текстовый узел;
  • узел элемента XML;
  • инструкция обработки XML;
  • комментарий XML.

События вызываются появлением как открывающего тэга, так и закрывающего тэга любого из этих элементов документа. Атрибут XML также рассматривается как событие.

Анализ документа является однонаправленным (т.е. без возвратов по дереву).

В отличие от DOM формальной спецификации для SAX не существует. В качестве нормативной рассматривается Java реализация SAX.

Следует отметить следующие достоинства и недостатки SAX.

Достоинства:

  • Затраты памяти существенно меньше (зависит от максимальной глубины дерева документа и количества атрибутов в узле элемента), чем в случае DOM (требуется хранить в памяти все дерево документа).
  • Скорость работы выше за счет сокращения затрат времени на выделение памяти для элементов дерева в случае DOM.
  • Потоковое чтение данных с диска в случае DOM невозможно. Если для размещения всего документа в памяти недостаточно места, то использование SAX является безальтернативным.

Недостатки:

  • Процедура проверки правильности предполагает доступ ко всему документу одновременно.
  • Это также требуется и в случае XSLT преобразования.

Структура и представление XML документа

Если загрузить "чистый" XML документ в веб-браузер, то можно будет увидеть древовидную структуру этого документа:

Вид XML документа в веб-браузере.

Рис. 13.3. Вид XML документа в веб-браузере.

В этом как раз и заключается главное отличие между XML и HTML, а именно разделение структуры документа и его представления в браузере. Конкретный вид XML документа описывается отдельно с помощью CSS или XSL.

CSS и XSL - принципиально разные технологии, имеющие лишь частичное пресечение областей применения. CSS-форматирование применяется к HTML-документу браузером на клиентской стороне, а XSL-преобразование выполняется, как правило, на сервере, после чего результат отправляется браузеру клиента. XSL базируется на XML, благодаря чему XSL более гибок и универсален. У разработчиков имеется возможность использовать средства контроля за корректностью составления стилевых списков (используя схемы XML).

С помощью XSL можно преобразовать XML-документ в формат HTML, WML, RTF, PDF, SQL, SWF, а так же в другой XML и XSL документ. XSL указывает как будет оформлен документ, где и каким образом должны размещаться данные.

Cпецификация XSL состоит из трех частей:

  • XSLT (XSL Transformations), язык для преобразования XML;
  • XPath - язык путей и выражений, используемый в XSLT для доступа к отдельным частям XML-документа;
  • XSL-FO (XSL Formatting Objects), язык для верстки XML.

Наиболее распространенным механизмом XSLT преобразований для систем работающих на платформе Microsoft Windows является MSXML; для систем на основе GNU - xsltproc.

Для того, чтобы обработать XML документ c помощью XSL, необходимо в XML документе написать следующую инструкцию:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="my-style.xsl"?> 
<root> 
  < !-- ... -- > 
</root> 
Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Галина Башкирова
Галина Башкирова

Здравствуйте, недавно закончила курс по проф веб программиованию, мне прислали методические указания с примерами тем, однако темы там для специальности 

Системный администратор информационно-коммуникационных» систем.
Мне нужно самой найти тему? или делать по высланным темам

 

Елена Кашникова
Елена Кашникова
Россия, братск