|
Просмотр XML - документов
Как уже отмечалось, в отличии от HTML, XML никак не
определяет способ отображения и использования
описываемых с его помощью элементов документа, т.е.
программе-анализатору предоставляется возможность самой
выбирать нужное оформление. Этого требует принцип
независимости определения внутренней структуры документа
от способов представления этой информации. Например,
задавая в документе элемент <flower>роза</flower>, мы
лишь указываем, что rose в данном случае является
цветком, но информации о том, как должен выглядеть
данный элемент документа на экране клиента и должен ли
он отображаться вообще, в таком определении нет.
Для того, чтобы использовать данные, определяемые
элементами XML, например, отображать их на экране
пользователя, необходимо написать программу-анализатор,
которая бы выполняла эти действия. Уже сегодня таких
программ появилось достаточное количество и у
разработчиков существует возможность выбора наиболее
подходящей из них для решения конкретных проблем
Как уже отмечалось ранее, в общем случае, программы-
анализаторы можно разделить на две группы:
верифицирующие (т.е. использующие DTD- описания для
определения корректности документа) и не верифицирующие.
Если Вы создаете свой язык и описываете его грамматику
на основе DTD, то для анализа документов, написанных на
этом языке, безусловно, потребуется программа,
проверяющая корректность составления документа. Но так
как использование DTD в XML не является обязательным, то
любой правильно оформленный документ может быть
распознан и разобран программой, предназначенной для
анализа XML- документов. В любом случае, используя
универсальные XML- анализаторы, Вы можете быть уверенным
в том, что если заданные в документе конструкции языка
являются синтаксически правильными, то
программа-анализатор сможет правильно извлечь
определяемые ими элементы документа и передать их
прикладной программе, выполняющей необходимые действия
по отображению. Т.е. после разбора документа в
большинстве случаев, Вам предоставляется объектная
модель, отображающая содержимое Вашего документа, и
средства, необходимые для работы с ней (прохода по
дереву элементов). При этом в некоторых анализаторах
способ представления структуры документа основывается на
спецификации DOM. Поэтому у Вас
появляется также возможность использовать строгую
иерархическую модель 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.
|
|
|