В Приложении 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 под элементом понимается как название тэга, так и текстовое содержимое его)
- Встретилось текстовое поле. Это поле может быть либо комментарием, либо просто текстом, содержащемся в текущем элементе