XML遍历算法大征集

有请广大高手

希望最好能用Java或者JavaScript来实现

小弟先在这里贴个最简单的递归,抛砖引玉,闪先:)

 1<script language="javascript">   
 2  
 3function loader()   
 4{   
 5var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");   
 6  
 7var rootNode;   
 8  
 9xmlDoc.load("nav.xml");   
10  
11if (xmlDoc.readyState==4)   
12{   
13if(xmlDoc.parseError.errorCode!=0)   
14{   
15alert(xmlDoc.parseError.reason)   
16}   
17else   
18{   
19rootNode = xmlDoc.documentElement;   
20scanXml(rootNode);   
21}   
22}   
23}   
24  
25function scanXml(xmlNode)   
26{   
27if (xmlNode.hasChildNodes())   
28{   
29var nodeList = xmlNode.childNodes;   
30  
31for(var i=0;i<nodeList.length;i++)   
32{   
33scanXml(nodeList[i]);   
34}   
35}   
36else   
37{   
38// do something   
39}   
40}   
41</script>

---------------------------------------------------------------

//占个位置先^_^先序遍历
var oRoot=xmlDoc.documentElement //Root
while(null!=oNode){
visit(node) //visit node
if(oNode.hasChildNodes()){
oNode=oNode.firstChild
}
else{
while(null!=oNode && null==oNode.nextSibling){
oNode=oNode.parent
}

if (null!=oNode){
oNode=oNode.nextSibling
}
else{
break
}
}

}
---------------------------------------------------------------

少一句oNode=oRoot在while前面
---------------------------------------------------------------

oNode=oNode.parent-->oNode=oNode.parentNode
信手一写,BUG一双....
---------------------------------------------------------------

最好的方法是用digester,是基于sax实现的:

http://jakarta.apache.org/struts/doc-1.0.2/api/org/apache/struts/digester/package-summary.html#package_description
---------------------------------------------------------------

ibm网站上的x-udom上有例子。
---------------------------------------------------------------

还要找属性啊?怎么不加上呢
---------------------------------------------------------------

大写意:
creat DOM
DOM.load(file of xml)

---------------------------------------------------------------

上有误!
大写意:
creat DOM
DOM.load(file of xml)
xmlnodeset=selectnode(")
count=length(xmlnodeset)
for i=1 to count
get nodetype of xmlnodeset.item(i)
get nodename of xmlnodeset.item(i).....
(属性值要根据节点的类型判断有无
有->count;for j=1 to count->一个一个的提取)
end

---------------------------------------------------------------

//你看不到堆栈了,因为dom实现的不是单向链表,节点可以回溯到上一层,不必借助堆栈来实现.后根遍历:
var oRoot=xmlDoc.documentElement //Root
while(null!=oNode){
if(oNode.hasChildNodes()){
oNode=oNode.firstChild
}
else{
visit(node) //visit node
while(null!=oNode && null==oNode.nextSibling){
oNode=oNode.parent
if (null != oNode){
visit(node) //visit parent node
}
}

if (null!=oNode){
oNode=oNode.nextSibling
}
else{
break
}
}

}

Published At
Categories with Web编程
comments powered by Disqus