新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 关于 XML 的一般性技术讨论,提供 XML入门资料 和 XML教程
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XML基础 』 → [原创]通过javascript+DOM方式遍历XML节点(一)[摘要] 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 9441 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: [原创]通过javascript+DOM方式遍历XML节点(一)[摘要] 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 XML基础 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客楼主
    发贴心情 [原创]通过javascript+DOM方式遍历XML节点(一)[摘要]

    JAVASCRIPT实现:

    <script language="javascript">
    /*
    ******************************************************
    *代码:Qr http://Qr.blogger.org.cn                                      *
    *时间:2006/07/15 21:36:00                                                  *
    *功能:遍历XML的所有节点,仿IE浏览XML方式输出     *
    *类型:支持TEXT、CDATA、COMMENT、ELEMENT节点*
    ******************************************************
    */
    var xml = null , format = "" , fo = "&nbsp;&nbsp;&nbsp;&nbsp;" ;

    function main(){
        createXmlDom("parser.xml");
        Recursion(xml.documentElement);
    }

    function createXmlDom(xmlUrl){//这里大家可以自己处理一下,以适应不同浏览器
        xml = new ActiveXObject("Msxml2.DOMDocument");
        xml.async=false;
        xml.load(xmlUrl);
    }

    function Recursion(o) {
        if(typeof(o)=="number")return;
        if(o.nodeType==3 || o.nodeType==4 || o.nodeType==8){
            switch(o.nodeType){
                case 3://[TEXT型节点]
                if(o.nextSibling || o.previousSibling)document.write("<br>"+format);
                document.write(o.nodeValue);
                //针对混合节点的末节点为文本节点的情况
                if(!o.nextSibling && o.previousSibling){
                    document.write("<br>"+format.substr(0,format.length-24));
                }
                break;

                case 4://[CDATA型节点]
                document.write("<br>"+format+"&lt;![CDATA["+o.nodeValue+"]]&gt;");//.replace("<","&lt;")
                break;

                case 8://[COMMENT型节点]
                document.write("<br>"+format+"&lt;!--"+o.nodeValue+"--&gt;");//.replace("<","&lt;")
                break;
            }
            if(o.nextSibling){
                //#有同级兄弟元素节点#//
                return arguments.callee(o.nextSibling);
            }else{
                //#返回上级相邻未解析节点#//
                return arguments.callee(N2NP(o.parentNode));

                //开始因为N2NP这个函数有问题,所以用try{}catch(e){}
                //try{return arguments.callee(N2NP(o.parentNode));}catch(e){document.write

    ("<b><i>err:"+e+"</i></b>")};
            }
        }
        if(!o.hasChildNodes()){//[空无素(ELEMENT)或仅含属性(ATTRIBUTE)]
            if(o!=xml.documentElement)document.write("<br>");
            if(o.nodeType==1)document.write(format+"&lt;"+o.nodeName);
            if(o.attributes.length>0)attrparser(o);
            document.write("/&gt;");
            if(o.nextSibling){
                //#有同级兄弟元素节点#//
                return arguments.callee(o.nextSibling);
            }else{
                //针对混合节点的末节点为空元素的情况
                if(o.previousSibling)document.write("<br>"+format.substr(0,format.length-24));

                //#返回上级相邻未解析节点#//
                return arguments.callee(N2NP(o.parentNode));

                //开始因为N2NP这个函数有问题,所以用try{}catch(e){}
                //try{return arguments.callee(N2NP(o.parentNode));}catch(e){document.write("<b>err:"+e+"</b>")};
            }
        }
        if(o.hasChildNodes()){//有子节点,包括:TEXT、CDATA、COMMENT、ELEMENT
            if(o.nodeName!=xml.documentElement.nodeName)document.write("<br>");
            if(o.nodeType==1)document.write(format+"&lt;"+o.nodeName);
            if(o.attributes.length>0)attrparser(o);
            document.write("&gt;");

            if(o.hasChildNodes()){//#有下级元素节点#//
                format += fo;
                return arguments.callee(o.firstChild);
            }else{
                if(o.nextSibling){//#有同级兄弟元素节点#//
                    return arguments.callee(o.nextSibling);
                }
            }
        }
    }

    function N2NP(p){//alert(p.nodeName+":"+p.nodeValue)

        if(p.nextSibling){
            format = format.substr(0,format.length-24);
            //输出关闭标记
            if(p.nodeType==1 && p.firstChild.nodeType==3)document.write("&lt;/"+p.nodeName+"&gt;");
            if(p.nodeType==1 && p.firstChild.nodeType!=3)document.write("<br>"+format+"&lt;/"+p.nodeName+"&gt;");
            return p.nextSibling;//返回相邻节点
        }else{

            format = format.substr(0,format.length-24);
            //输出关闭标记
            if(p.parentNode && p.firstChild.nodeType==3)document.write("&lt;/"+p.nodeName+"&gt;");
            if(p.parentNode && p.firstChild.nodeType!=3)document.write("<br>"+format+"&lt;/"+p.nodeName+"&gt;");
            if(p==xml.documentElement){return 0;}else{//如果不进行判断,函数将返回#document,导致错情
                return arguments.callee(p.parentNode);//#返回上级相邻未解析元素节点#//
            }
        }
    }

    function attrparser(o){//遍历节点元素
        if(o.attributes){
            var attr = o.attributes;
            for(i=0;i<attr.length;i++){
                document.write(" "+attr[i].nodeName+'="'+attr[i].firstChild.nodeValue+'"');
            }
        }
    }
    main();
    </script>



    测试用XML文档:
    parser.xml:
    <?xml version="1.0" encoding="gb2312" ?>

    <root>
        <!--COMMENT和CDATASection作为首个子节点在此出现没问题-->
        <elements attribute="来个无文本节点试试,哈哈,没问题"/>
        <elements>
            <element attribute1="随便啦" attribute2="再多一个又如何">只有一行文本的节点</element>
            <CDATASection>
                <![CDATA[CDATASection和COMMENT相邻出错?※搞掂※]]>
                <!--COMMENT和CDATASection相邻出错?※搞掂※-->
            </CDATASection>
            <COMMENT>
                <!--针对以上相邻出错的问题将两个类型节点换个次序-->
                <![CDATA[已经没有问题啦]]>
            </COMMENT>
            <CDATASection>
                <![CDATA[CDATASection嵌套在一个空节点内]]>
            </CDATASection>
            <elem1>
                <elem2>
                    既然已经解决,再加一个文本节点再这里试试!
                    <elem3>
                        <![CDATA[CDATASection嵌套在多级空节点内出错?※搞掂※]]>
                    </elem3>
                    再再加一个文本节点再这里试试,没问题!
                </elem2>
            </elem1>
            <![CDATA[CDATASection嵌套在两级以上节点均已调试通过]]>
            <COMMENT>
                <!--COMMENT嵌套在一级空节点中-->
            </COMMENT>
            <COMMENT>
                <!--再加一个在此处-->
                <comment>
                    <!--COMMENT嵌套在多级空节点中-->
                </comment>
            </COMMENT>
            <!--COMMENT嵌套在两级以上节点均已调试通过-->
            <!--COMMENT-->
            <![CDATA[CDATASection]]>
            <ELEMENT ATTRIBUTE="属性值">元素文本</ELEMENT>
            <![CDATA[CDATASection混杂在节点中]]>
            <中文节点>已经定义了encoding,没问题的</中文节点>
            <!--COMMENT混杂在节点中-->
            <ELEM>ELEM1</ELEM>
            <ELEM>ELEM2</ELEM>
            <ELEM>ELEM3</ELEM>
            <EMPTY>
                <empty>
                    <noValue/>
                </empty>
            </EMPTY>
            <!--两级及以上空节点嵌套已通过-->
            <ELEMENT>
                <element 属性="attribute" 还是属性="ATTRIBUTE">两级节点嵌套,含文本</element>
            </ELEMENT>
            <ELEMENT>
                <element>
                    <elem>多级节点嵌套,含文本</elem>
                    <!--COMMENT或CDATASection在末尾有问题!※搞掂※-->
                </element>
            </ELEMENT>
            <interfusion>
                <!---->
                混合节点调试通过
                <element>
                    element value
                    <empty/>
                </element>
                空元素调试通过
                <!--COMMENT-->
                <![CDATA[CDATASection]]>
                Text
                <ELEMENT>ELEMENT VALUE</ELEMENT>
                TEXT
                <![CDATA[COMMENT或CDATASection在末尾有问题!※搞掂※]]>
            </interfusion>
        </elements>
        <!--COMMENT或CDATASection作为根节点的末子节点有问题!※搞掂※-->
        <![CDATA[你会不会设计如此结构的XML文档,反正偶不会,看着就头痛□]]>
    </root>

    缺点:自定义函数Recursion()所使用的javascript递归更加严重影响了遍历和性能,对于体积庞大的XML文档,不能完整将其节点遍历出来了。

    详阅:http://blogger.org.cn/blog/more.asp?name=Qr&id=26476


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/7/19 0:06:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML基础 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/3 12:55:03

    本主题贴数1,分页: [1]

     *树形目录 (最近20个回帖) 顶端 
    主题:  [原创]通过javascript+DOM方式遍历XML节点(一)[摘要]..(7794字) - Qr,2007年7月19日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    89.844ms