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