Просмотр XML документов
Как уже отмечалось, в отличии от HTML, XML никак не
определяет способ отображения и использования описываемых с его
помощью элементов документа, т.е. программе-анализатору
предоставляется возможность самой выбирать нужное оформление. Этого
требует принцип независимости определения внутренней структуры
документа от способов представления этой информации. Например,
задавая в документе элемент роза , мы лишь
указываем, что rose в данном случае является цветком, но
информации о том, как должен выглядеть данный элемент документа на
экране клиента и должен ли он отображаться вообще, в таком
определении нет.
Для того, чтобы использовать данные, определяемые
элементами XML, например, отображать их на экране пользователя,
необходимо написать программу-анализатор, которая бы выполняла эти
действия. Уже сегодня таких программ появилось достаточное
количество и у разработчиков существует возможность выбора наиболее
подходящей из них для решения конкретных проблем
Как уже отмечалось ранее, в общем случае,
программы- анализаторы можно разделить на две группы:
верифицирующие(т.е. использующие DTD- описания для определения
корректности документа) и не верифицирующие. Если Вы создаете свой
язык и описываете его грамматику на основе DTD, то для анализа
документов, написанных на этом языке, безусловно, потребуется
программа, проверяющая корректность составления документа. Но так
как использование DTD в XML не является обязательным, то любой
правильно оформленный документ может быть распознан и разобран
программой, предназначенной для анализа XML- документов. В любом
случае, используя универсальные XML- анализаторы, Вы можете быть
уверенным в том, что если заданные в документе конструкции языка
являются синтаксически правильными, то программа-анализатор сможет
правильно извлечь определяемые ими элементы документа и передать их
прикладной программе, выполняющей необходимые действия по
отображению. Т.е. после разбора документа в большинстве случаев, Вам
предоставляется объектная модель, отображающая содержимое Вашего
документа, и средства, необходимые для работы с ней (прохода по
дереву элементов). При этом в некоторых анализаторах способ
представления структуры документа основывается на спецификации DOM,
описанной в 4 части. Поэтому у Вас появляется также возможность
использовать строгую иерархическую модель DOM для построения
собственных документов.
Если речь идет о способах отображения информации,
хранящейся в XML, то необходимо упомянуть разрабатываемый в
настоящее время W3C стандарт стилевых таблиц для XML, которые
предназначены для описания правил отображения элементов XML. Более
подробно мы поговорим об XSL чуть позже.
Использование msxml в IE 4
Если на Вашем компьютере установлен броузер
Internet Explorer 4 (или более поздняя версия), то Вы можете
использовать встроенный в этот броузер XML- анализатор msxml в своих
сценариях, написанных на Java Script ил VBScript,. В настоящий
момент существуют две его реализации, - одна предназначена для
использования в виде написанного на C++ ActiveX- объекта(реализация
на базе COM- технологии) другая, написанная на Java, не зависит от
платформы. Оба анализатора не сложны, имеют сравнительно небольшой
размер - msxml на C++ занимает около 100k, версия на Java - 127k.
Анализатор, написанный на C++, в текущей реализации не поддерживает
DTD- правил, более компактный и быстрый, чем его Java-версия. Оба
они имеют поддержку иностранных языков, т.е. в составе Internet
Explorer C++- анализатор работает со всеми языками, "понимаемыми"
броузерами, а анализатор на Java - с теми языками, с которыми может
работать виртуальная Java-машина.
Т.к. обе версии разрабатывались параллельно,
объектная модель, заложенная в основу каждой из них, внешне схожа,
поэтому больших сложностей при переходе от одной версии к другой
обычно не возникает.
Рассмотрим основные свойства и методы, доступные
JavaScript- сценарию в процессе его выполнения на стороне броузера.
В наших примерах мы будем использовать XML- анализатор в сценариях
Java Script, т.к. этот способ более понятен и быстрее работает.
Полное описание C++ интерфейсов анализатора доступны в документации
по Internet Client SDK
Объектная модель XML в Internet Explorer
4.0
Перед тем, как использовать свойства и методы
анализатора, его необходимо создать. Делается это при помощи
стандартного метода, предназначенного для создания ActiveX-
объектов:
var mydoc = new ActiveXObject("msxml");
Если ActiveX- компонент был зарегистрирован на
Вашей машине(или у Вас установлен броузер Internet Explorer 4), то в
результате выполнения этой функции переменной mydoc будет присвоен
объект, имеющий тип msxml, свойства и методы которого используются в
дальнейшем для получения доступа к структуре XML- документа.
В Приложении 2
приведен полный текст сценария JavaScrtipt, выводящего на экран
броузера Internet Explorer 4.0 XML- документ, созданный в
Приложении 1. Вы
можете использовать этот пример и комментарии к нему в качестве еще
одного средства для более быстрого понимания принципов использования
свойств и методов объектов Microsoft XML и создания собственных
сценариев.
Объектная модель XML- анализатора Microsoft может
быть представлена в виде следующего набора внутренних объектов:
XML Document , XML Element и Element Collection
. Объект XML Document содержит свойства и методы, необходимые нам
для работы с XML- документом в целом. XML Element отвечает за работу
с каждым из элементов XML- документа. Element Collection
представляет из себя набор элементов, доступ к которым доступен при
помощи имени или порядкового номера. В следующих примерах мы
рассмотрим каждый из этих объектов подробнее.
Свойства и методы документа (объект XML Document)
| URL |
Свойство, доступное для записи и чтения. Задает
или возвращает URL обрабатываемого документа. В случае
изменения этого свойства текущий документ уничтожается и
начинается загрузка нового по указанному URL |
| root |
Возвращает корневой элемент XML- документа
|
| charset |
Свойство, доступное для записи и
чтения.Возвращает или устанавливает название текущее
кодировочной таблицы согласно требованиям ISO. |
| version |
Возвращает номер версии XML |
| doctype |
Возвращает содержимое элемента !DOCTYPE |
| createElement() |
Метод, позволяющий создать новый элемент,
который будет добавлен в качестве дочернего для текущего
элемента дерева. В качестве первого параметра задается тип
элемента, в качестве второго - название элемента
xml.createElement(0,"new_element") |
| fileSize |
Возвращает размер XML- документа. Это свойство
в C++- версии анализатора еще не реализовано |
| fileModifiedDate |
Возвращает дату последнего изменения XML-
документа. Это свойство в C++- версии анализатора еще не
реализовано |
| fileUpdatedDate |
Возвращает дату последнего обновления XML-
документа. Это свойство в C++- версии анализатора еще не
реализовано |
| mimeType |
Возвращает MIME-тип(MIME- Multipurpose Internet
Mail Extension, RFC 1341).Это свойство в C++- версии
анализатора еще не реализовано |
Ниже приведен фрагмент JavaScript- сценария,
использующего эти методы и свойства для вывода информации о текущем
документе:
var xmldoc = new ActiveXObject("msxml");
var xmlsrc = "http://localhost/xml/journal.xml";
xmldoc.URL = xmlsrc;
function viewProperties(){
this.document.writeln('
');
this.document.writeln('
');
this.document.writeln('
Document URL
|
'+xmldoc.URL+'
| ');
this.document.writeln('');
this.document.writeln('| Document root |
'+xmldoc.root+' | ');
this.document.writeln('');
this.document.writeln('| Document doctype |
'+xmldoc.doctype+' | ');
this.document.writeln('');
this.document.writeln('| Document version |
'+xmldoc.version+' | ');
this.document.writeln('');
this.document.writeln('| Document charset |
'+xmldoc.charset+' | ');
this.document.writeln(' ');
}
Свойства и методы элементов документа
| type |
Возвращает тип элемента. Это свойство может
быть использовано для того, чтобы разделить имена тэгов и
данные, содержащиеся внутри них. В данной версии анализатора
определены следующие типы элементов: 0 - элемент 1 -
текст 2 - комментарий 3 - Document 4 - DTD |
| tagName |
Возвращает или устанавливает название тэга(в
виде строки с символами, приведенными к верхнему регистру).
Названия метатэгов(например, ) начинаются с символа ?.
Названия тэгов комментариев начинаются с символа !. |
| text |
Возвращает текстовое содержимое элементов и
комментариев. |
| AddChild() |
Добавление нового дочернего элемента и всех его
потомков в текущую ветвь дерева. В качестве первого параметра
этой функции необходимо передать объект типа Element, который
затем будет помещен в список дочерних элементов. Также
необходимо задать индекс нового элемента в списке и в качестве
последнего параметра обязательно передать значение -1. Т.к. в
данной модели любой элемент в документе может иметь ссылку
только на один родительский элемент, при выполнении данной
процедуры у добавляемого объекта старая ссылка на родительский
элемент теряется. Используя это свойство, можно перемещать
элементы из одного XML- документа в другое, но том случае,
если у дочерних ссылок перемещаемого элемента существуют
внешние ссылки или сами дочерние элементы ссылаются на внешние
возможно возникновение ошибки
elem.addChild(elem.children.item().children.item(0),0,-1)
|
| removeChild() |
Удаляет дочерний элемент и всех его потомков.
Элементы остаются в памяти и могут быть вновь добавлены к
дереву при помощи метода addChild().
elem.removeChild(elem.children.item(1)) |
| parent |
Возвращает указатель на текущий родительский
элемент. Ссылки на родительский элемент имеют все элементы, за
исключением корневого. |
| GetAttribute() |
Возвращает значение указанного атрибута в виде
текстовой строки. elem.getAttribute("color") |
| SetAttribute() |
Устанавливает указанный атрибут и его значение.
Прежнее значение атрибута теряется
elem.setAttribute("color","red") |
| removeAttribute() |
Уничтожает указанный атрибут
elem.removeAttribute("color") |
| children |
Возвращает ассоциированный список дочерних
элементов(коллекцию). Такой список позволяет приложению
получать нужные элементы как по названию, так и по порядковому
номеру при помощи метода item(). В том случае, если потомков у
текущего элемента нет, функция возвратит null
|
Пример использования
Вот пример использования описанных функций:
Как видно из примера, в процессе обработки XML-
документа необходимо рекурсивно обходить все ветви создаваемого
анализатором дерева, причем, на каждом шаге возможны следующие
ситуации:
- Встретился новый элемент. В этом случае его
название(задаваемое тэгом) доступно при помощи свойства tagName, а
содержимое - свойством text. У любого непустого элемента
существует хотя бы один потомок, представляющий собой содержимое
этого элемента(в этом отличие представленной объектной модели
msxml от реальной структуры документа - в XML под элементом
понимается как название тэга, так и текстовое содержимое его)
- Встретилось текстовое поле. Это поле может быть либо
комментарием, либо просто текстом, содержащемся в текущем элементе
Для обработки потомков текущего элемента
используется метод item(), который вызывается в цикле столько раз,
сколько потомков у текущего элемента. Обработка каждого дочернего
элемента осуществляется вызовом этой же функции, в чем и заключается
рекурсия.
Использование ASP
Доступ к свойствам XML- анализатора возможен также
из сценариев ASP(Active Server Pages), выполняющихся на стороне
сервера. Если при написании ASP-модуля используется язык VBscript,
то для создания объекта, представляющего XML- документ, необходимо
включить следующее выражение:
Set myxml=Server.CreateObject("msxml")
Однако необходимо учитывать, что в качестве сервера
в этом случае надо использовать Web- сервер, поддерживающий ISAPI, и
так же на компьютере должны быть установлены или броузер Internet
Explorer версии 4 и выше, или зарегистрированный в реестре ActiveX-
компонент msxml.
Вот пример использования свойств XML-документа в
ASP- программе:
<%
Set myxml=Server.CreateObject("msxml")
myxml.url = "http://localhost/xml/sample1.xml"
url=myxml.url
Set root=myxml.root
version=myxml.version
charset=myxml.charset
%>
|