JXTree对象读取外部xml文件数据生成树的函数

2016-02-19 10:03 16 1 收藏

今天图老师小编要向大家分享个JXTree对象读取外部xml文件数据生成树的函数教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - Web开发 】

/******************************************
*JXTree对象,读取外部xml文件数据,生成树
*@author brull
*@email brull@163.com
*@date 2007-03-27
*******************************************/

/*
 *@param xmlURL XML文件的地址
 */
var JXTree = function(xmlURL)
{
    var result = new Array();

    /*****************************
    *首先定义TreeNode抽象对象
    *TreeNode对象属性:
    *id 唯一编号,必须在xml文件里定义为节点属性
    *level 节点层次,从-1开始(即根节点)
    *_click 节点click,在xml文件定义为节点属性[可选]
    *isLast 是否为本节点所在层次最后一个节点
    *parent_isLast 父节点是否为父节点所在层次的最后一个节点
    *toHTML 本节点转成HTML代码的方法
    *******************************/
    var TreeNode = function (node,level)
    {
        var parent_elements = node.parentNode ? (node.parentNode.parentNode ? node.parentNode.parentNode.childNodes : null) : null;
        var elements = node.parentNode ? node.parentNode.childNodes : null;
        this.id = XMLDom.getAttribute(node,"id") ? XMLDom.getAttribute(node,"id") : "";
        this.level = level;//节点的层次
        this.isLast = elements ? ((elements.item(elements.length-2) === node) ? true : false) : false;
        this._click = XMLDom.getAttribute(node,'click') ? XMLDom.getAttribute(node,'click') : "";
        this.toHTML = null;//function
    }

    /*****************************
    *ElementNode对象,继承自抽象对象TreeNode
    *新增属性:
    *_nodeName 节点名称
    ******************************/
    var ElementNode = function(node,level)
    {
        TreeNode.apply(this,arguments);
        this._nodeName = XMLDom.getAttribute(node,"name") ? XMLDom.getAttribute(node,"name") : "";
        this.toHTML = function(){
            var result = "";
            if(this.isLast) result += "divdiv class='minus_bottom'";
            else result += "divdiv class='minus'";
            result += " id='"+this.id+"_join' onclick="JXTree.changeState('"+this.id+"')"/divdiv id='"+this.id+"_folder' class='folder_open'/divspan class='text' onclick=""+this._click+"""+this._nodeName+"/span/div";
            return result;
        }
    }

    /*****************************
    *TexNode对象,继承自抽象对象TreeNode
    *属性和TreeNode一样
    *新增属性:
    *_nodeValue 节点值
    ******************************/
    var TextNode = function(node,level)
    {
        TreeNode.apply(this,arguments);
        this._nodeValue = node.firstChild.nodeValue;
        this.toHTML = function(){
            var result = "";
            if(this.isLast) result += "divdiv class='join_bottom'/div";
            else result += "divdiv class='join'/div";
            result += "div class='page'/divspan class='text' id='"+this.id +"_item' onclick="JXTree.setFocus(this.id);"+this._click+"""+this._nodeValue+"/span/div";
            return result;
        }
    }

    /**********Node 节点构建结束,开始解释XML文件************/

    var DOMRoot=XMLDom.loadXML(xmlURL).documentElement;//同步加载XML文件
    var level = -1;//root节点level
    var stack = new Array(1);
    result.push("divdiv class='root'/divspan class='text'"+XMLDom.getAttribute(DOMRoot,"name")+"/span/div");
    //解释xml文件内容成树状态展开的HTML代码,递归调用
    this.parseXML = function(node){
        stack.push(level);
        level++;
        var element = new ElementNode(node,level);
        var elements = node.childNodes;
        if(level != 0){
            if(element.isLast)
                result.push("div id='"+element.id+"_body' class='body_empty'");
            else
                result.push("div id='"+element.id+"_body' class='body_line'");
        }
        for(var i=0;ielements.length;i++){
            if(elements.item(i).nodeName == "item"){//节点为树叶
                var textNode = new TextNode(elements.item(i),level);
                result.push(textNode.toHTML());
                textNode = null;//及时释放对象
            }
            else if(elements.item(i).nodeType ==1){//节点为树枝
                var elementNode = new ElementNode(elements.item(i),level);
                result.push(elementNode.toHTML());
                elementNode = null;//及时释放对象
                this.parseXML(elements.item(i));
            }
        }
        if(level != 0)result.push("/div");
        level = stack.pop();
    }

    //得到解释结果并返回
    this.getTree = function(){
        this.parseXML(DOMRoot);
        DOMRoot = null;//释放DOM对象
        return result.join("");
    }
    /*************静态属性***************/
    JXTree.curText = null;//当前文本的id

    /************静态方法***************/
    JXTree.changeState = function (id){//展开或者收缩节点内容
        var _body = document.getElementById(id + "_body");
        var _join = document.getElementById(id+"_join");
        var folder = document.getElementById(id+"_folder");
        (_body.style.display == "none") ? (
            _body.style.display = "block",
            _join.className = _join.className.replace("plus","minus"),
            folder.className = "folder_open"
        ) : (
            _body.style.display = "none",
            _join.className = _join.className.replace("minus","plus"),
            folder.className = "folder_close"
        )
    };//changeState
    JXTree.setFocus = function(id){
        if(JXTree.curText)
            with(document.getElementById(JXTree.curText).style){
                backgroundColor = "";
                color = "#000";
            }
            with(    document.getElementById(id).style){
                backgroundColor = "#003366";
                color = "#FFF";
            }
        JXTree.curText = id;
    }
}

来源:https://www.tulaoshi.com/n/20160219/1593174.html

延伸阅读
标签: Web开发
一、必须弄清楚最终需要的是什么 我们通过asp或其他动态编程语言,最终需要的是XML格式的数据,这点和XML数据所在的文件载体无关,它可以是实实在在的XML文件,比如:http://www.dw8.cn/common/dw8.xml 。也可以为asp文档,比如:http://www.cnbruce.com/blog/rss2.asp 他们都是XML数据的体现,为了实现XML数据的动态,所以需要...
艾奇文件数据恢复软件   最新版的艾奇文件数据恢复软件,支持本地磁盘、移动硬盘、U盘、SD卡、TF卡、索尼记忆棒等存储设备上的文件恢复,包括图片、文件、视频等多种文件格式的恢复,扫描速度快,安全可靠,最大的特点是所见即所得,也就是扫描文件后可以预览,包括图片、文档、视频等,这样就可以有针对性的恢复,而不是将所有垃圾文...
标签: Web开发
一个客户提供一个股价的信息,要求放在页面上,显示一些数据,需要从远程获取xml,然后解析写在网页上,开始不会觉得很难,其实蛮简单的,先用javascript写了一个: 以下为引用的内容: script language=javascript var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.load("http://****.com/scripts/***...
标签: Web开发
到此就可以就发送请求读取服务器端的XML数据了,最后要做的就是处理数据了。 关于XMLHttpRequest对象,请参考About XMLHttpRequest Object一文。 看例子: //AjaxDemo.html !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-tr...
标签: Web开发
看到网上一片文章,自己式了一下,果然 XMLTextReader速度要快! 在.NET框架的System.XML名称空间中包含的XMLTextReader类不需要对系统资源要求很高,就能从XML文件中快速读取数据。使用XMLTextReader类能够从XML文件中读取数据,并且将其转换为HTML格式在浏览器中输出。   读本文之前,读者需要了解一些基本知识:XML...

经验教程

531

收藏

45
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部