» Xml для новичков
» Главная страница
»
К оглавлению
Использование 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-
документа.
Вы можете
использовать этот пример и комментарии к нему в качестве еще одного средства для
более быстрого понимания принципов использования свойств и методов объектов
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(), который вызывается в цикле столько раз, сколько потомков у текущего
элемента. Обработка каждого дочернего элемента осуществляется вызовом этой же
функции, в чем и заключается рекурсия. Следующий
урок
|