2. Просмотр XML - документов
Как уже отмечалось, в отличии от HTML, XML никак не определяет
способ отображения и использования описываемых с его помощью
элементов документа, т.е. программе-анализатору предоставляется
возможность самой выбирать нужное оформление. Этого требует
принцип независимости определения внутренней структуры
документа от способов представления этой информации. Например,
задавая в документе элемент <flower>роза</flower>,
мы лишь указываем, что 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('<center><table width=90%
>');
this.document.writeln('<tr>');
this.document.writeln('<td align="center"
bgcolor="silver">Document URL</td>
<td align="center">'+xmldoc.URL+'</td></tr>');
this.document.writeln('<tr>');
this.document.writeln('<td align="center"
bgcolor="silver">Document root</td>
<td align="center">'+xmldoc.root+'</td></tr>');
this.document.writeln('<tr>');
this.document.writeln('<td align="center"
bgcolor="silver">Document doctype</td>
<td align="center">'+xmldoc.doctype+'</td></tr>');
this.document.writeln('<tr>');
this.document.writeln('<td align="center"
bgcolor="silver">Document version</td>
<td align="center">'+xmldoc.version+'</td></tr>');
this.document.writeln('<tr>');
this.document.writeln('<td align="center"
bgcolor="silver">Document charset</td>
<td align="center">'+xmldoc.charset+'</td></tr>');
this.document.writeln('</table></center>');
}
Свойства и методы элементов документа
type Возвращает тип элемента. Это свойство может быть
использовано для того, чтобы разделить имена тэгов и
данные, содержащиеся внутри них. В данной версии анализатора
определены следующие типы элементов:
0 - элемент
1 - текст
2 - комментарий
3 - Document
4 - DTD
tagName Возвращает или устанавливает название тэга(в
виде строки с символами, приведенными к верхнему регистру).
Названия метатэгов(например, <?xml?>)
начинаются с символа ?. Названия тэгов комментариев
начинаются с символа !.
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
Пример использования
Вот пример использования описанных функций:
<script language="javascript">
<!--
var xmldoc = new ActiveXObject("msxml");
var xmlsrc = "http://localhost/xml/sample.xml";
function parse(root){
var i=0;
if(root.type==0){
this.document.writeln('<UL>Current tag is '+root.tagName+'
(parent is '+root.parent+'). ');
}else if(root.type==1){
this.document.writeln('<LI>It is a text of '+root.parent.tagName+'
element: <i>'+root.text+'</i></LI>');
}else{
this.document.writeln('<br><br>Error');
}
if(root.children!=null){
this.document.writeln('It consist of '+root.children.length+'
elements:');
for(i=0;i<root.children.length;i++){
parse(root.children.item(i));
}
}
else{
this.document.writeln('</UL>');
}
}
function viewDocument(){
xmldoc.URL = xmlsrc;
this.document.writeln('<body bgcolor="white">');
this.document.writeln('<p><center><hr
width=80%>XML sample page
<hr width=80%></center><p>');
parse(xmldoc.root);
this.document.writeln('</body>');
}
viewDocument();
//-->
</script>
Как видно из примера, в процессе обработки 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
%>
<html>
<body bgcolor="white">
<center>
<table width=80%>
<tr>
<td align="center" bgcolor="silver">URL</td>
<td align="center"><%=url%></td>
</tr>
<tr>
<td align="center" bgcolor="silver">Version</td>
<td align="center"><%=version%></td>
</tr>
<tr>
<td align="center" bgcolor="silver">Root
element</td>
<td align="center"><%=root.tagName%></td>
</tr>
<tr>
<td align="center" bgcolor="silver">Charset</td>
<td align="center"><%=charset%></td>
</tr>
</table>
</body>
</html>
Создавая msxml- объект при помощи CreateObject, мы
в дальнейшем вызываем его методы и свойства привычным
нам способом. Отличается лишь способ вставки полученной
информации в HTML- страницу - она генерируется не на
стороне клиента, а приходит к нему в уже готовом виде.
В заключение хотелось бы отметить, что рассмотренные
способы работы с XML- документами могут применяться
для отображения их элементов на экране броузера. Не
всегда они являются наиболее эффективными для форматирования
текста - для каждого нового документа с измененной структурой
требуются частично или полностью переписывать обработчик(в
следующем разделе мы попробуем использовать для этих
же целей стилевые таблицы XSL). Однако использование
Java Script позволяет уже сегодня разрабатывать реальные
Интернет- приложения, использующие встроенный в броузер
клиента анализатор в качестве средства для доступа к
структурированной информации XML.
|