XML to tree XML 树

标签: xml to tree | 发表时间:2011-10-20 23:28 | 作者:柴哥 Bloger
出处:http://www.cnblogs.com/

前面发了一个 html to tree 再发一个 xml to tree

 

以下为代码

/*
    版权所有:版权所有(C) 2009 
    系统名称:树型控件
    文件名称:xml2tree.js
    作  者:DEVIN
    完成日期:2009-12-22
    压缩方式:jspacker
    主    页:http://www.chaige.net
*/
var XML2Tree = function (ini) {
    var $ = document, _this = this, $$ = 'documentElement';
    this.getTitle = ini.getTitle || String;
    this.click = ini.click || String;
    this.box = ini.shell.big ? $.getElementById(ini.shell) : ini.shell;
    this.edit = ini.edit ? true : false;
    this.color = ini.color ? ini.color : '#v';
    this.row = ini.row ? ini.row : '';
    this.box.innerHTML = '<p style="margin-left:10px"><img src="http://www.cnblogs.com/load3.gif" /> loading...<p>';
    this.getValue = ini.getValue || String;
    /* 异步下载Xml (chrome不能创建XMLDOC,使用Ajax构造) */
    this.xml = !!$.all ? (new ActiveXObject('Microsoft.XMLDOM')) : (new XMLHttpRequest());
    this.xml.onreadystatechange = function () {
        if (_this.xml.readyState == 4) {
            _this.box.innerHTML = '';
            _this.addSub($.all ? _this.xml[$$] : _this.xml.responseXML[$$], _this.box)
        }
    }
    if (!!$.all) {
        this.xml.async = true; this.xml.load(ini.url)
    }
    else {
        this.xml.open("GET", ini.url, true); this.xml.send(null)
    };
}
/*
共享接口
*/
XML2Tree.prototype = {
    folder: function (node) {
        var UI = function (_) { return document.createElement(_) }
			, caption = UI('DT'), shell = UI('DL'), body = UI('DD'), $ = XML2Tree.ini;
        shell.appendChild(caption);
        shell.appendChild(body);
        var folderIco = this.selectIco($.folder, $.node, XML2Tree.hasChild(node));
        caption.innerHTML = (this.edit ? '<label>' + this.expand(this.getValue.call(node)) + '</label>' : '')
			    + this.getLineIco(node) + this.getHasIco(node)
			    + folderIco + '<a href="javascript://"><span>'
			    + this.getTitle.call(node) + '</span></a>';
        caption.mapNode = node;
        var co = this.color;
        caption.onmouseover = function () {
            this.style.backgroundColor = co;
        }
        caption.onmouseout = function () {
            this.style.backgroundColor = '';
        }
        return { 'shell': shell, 'caption': caption };
    },
    addSub: function (node, shell) {
        if (node == null) return;
        var nodes = node.childNodes, _tree = this;
        for (var i = 0; i < nodes.length; i++) {
            if (nodes[i].nodeType != 1) continue; /* for FF find textNode */
            var _ = this.folder(nodes[i]);
            shell.appendChild(_.shell);
            _.caption.onclick = function (e) {
                var $ = XML2Tree, childShell = $.next(this);
                if (this.mapNode) {
                    var wrap = this.parentNode.getElementsByTagName('DD')[0];
                    if (XML2Tree.hasChild(this.mapNode)) {
                        _tree.addSub(this.mapNode, wrap);
                        $.toggle(this, true)
                    };
                    this.mapNode = null;
                } else {
                    if (!childShell) return;
                    if (XML2Tree.hasChild(childShell)) {
                        var hide = childShell.style.display == 'none';
                        childShell.style.display = hide ? '' : 'none';
                        $.toggle(this, hide);
                    };
                };
                e = e || window.event;
                var sE = e.srcElement || e.target;
                if (sE.tagName.toUpperCase() == 'SPAN') {
                    var title = sE.innerHTML;
                    if (!XML2Tree.hasChild(childShell)) {
                        _tree.click.call(sE, title, false); /* 叶节点单击, this 重置为 span */
                    } else {
                        _tree.click.call(childShell, title, true); /* 文件夹节点单击, this 重置为 子节点的壳DD */
                    }
                }
            };
        };
    },
    getLineIco: function (node) {
        var icos = [], root = node.ownerDocument;
        if (!root) return null;
        node = node.parentNode;
        while (node.parentNode != root) {
            var $ = XML2Tree, img = this.selectIco($.ini.line, $.ini.empty, !!$.next(node));
            icos = [img].concat(icos);
            node = node.parentNode;
        }
        return icos.join('');
    },
    getHasIco: function (node) {
        var last = !!XML2Tree.next(node), $ = XML2Tree.ini;
        return XML2Tree.hasChild(node) ?
			this.selectIco($.plus, $.plusBottom, last) :
			this.selectIco($.join, $.joinBottom, last)
    },
    expand: function (i) {
        var r = this.row, s = [];
        for (var k = 0; k < r.length; k++) {
            var url = r[k][0].replace('{0}', i);
            s.push('<a href="' + url + '">' + r[k][1] + '</a>' + (k == r.length - 1 ? '' : ' | '));
        }
        return s.join('');
    },
    selectIco: function (_1, _2, bool) {
        return '<img src="' + (bool ? _1 : _2) + '" align="absimddle" />'
    }
};
/*
静态接口
*/
XML2Tree.ini = {
    root: 'ui/base.gif',
    folder: 'ui/folder.gif',
    folderOpen: 'ui/folderopen.gif',
    node: 'ui/page.gif',
    empty: 'ui/empty.gif',
    line: 'ui/line.gif',
    join: 'ui/join.gif',
    joinBottom: 'ui/joinbottom.gif',
    plus: 'ui/plus.gif',
    plusBottom: 'ui/plusbottom.gif',
    minus: 'ui/minus.gif',
    minusBottom: 'ui/minusbottom.gif',
    nlPlus: 'ui/nolines_plus.gif',
    nlMinus: 'ui/nolines_minus.gif'
};
/* 图标预载 */
XML2Tree.prevLoad = function () {
    for (var key in this.ini) {
        var $ = new Image();
        $.src = this.ini[key];
    }
};
XML2Tree.next = function (node) {
    var $ = node, _ = 'nextSibling';
    for ($ = $[_]; $; $ = $[_]) {
        if ($.nodeType == 1) { return $ }
     };
    return null;
};
XML2Tree.hasChild = function (node) {
    var $ = node.childNodes;
    for (var i = 0; i < $.length; i++)
        if ($[i].nodeType == 1) return true;
    return false;
};
XML2Tree.toggle = function (node, isOpen) {
    var imgs = node.getElementsByTagName('IMG')
		, f = imgs.length - 1, $ = XML2Tree.ini;
    imgs[f].src = isOpen ? $.folderOpen : $.folder;
    if (this.next(node.parentNode)) {
        imgs[f - 1].src = isOpen ? $.minus : $.plus;
    } else {
        imgs[f - 1].src = isOpen ? $.minusBottom : $.plusBottom;
    }
};
/*
生成实例树 
参数:
url: xml 地址
shell: 树容器
loading: 下载中的效果html
getTitle: 标题来源属性操作 this 重置为 xml node
chick: 节点或者叶节点的单击事件(可得到参数title,isFolder与重置后的this)
*/
XML2Tree.prevLoad();

HTML代码

    <div id="TreeViewTreeView1"></div>
    <div class="xmlToTree">	
        <h3>省市</h3>	
        <div id="TreeView1"></div>
    </div>

JS调用

        new XML2Tree({
            url: 'city.xml',
            shell: 'TreeView1',
            edit: true,
            color: '#E9F5FF',
            row: [['city.aspx?action=add&i={0}&Language=Chinese', '添加'], ['city.aspx?action=edit&i={0}&Language=Chinese', '修改'], ['city.aspx?action=delete&i={0}&Language=Chinese', '删除']],
            getTitle: function () { return this.getAttribute('t') },
            getValue: function () { return this.getAttribute('v') },
            click: function (title, isFolder) {
            }
        });

 

下载地址

点我下载

~!~~~ 民工的命

原创代码,转载请联系 柴哥!!!

作者: 柴哥 发表于 2011-10-20 23:28 原文链接

评论: 1 查看评论 发表评论


最新新闻:
· 雅虎情归何处?杨致远大打太极拳 马云难解其意(2011-10-21 11:53)
· 手机输入法盘点(2011-10-21 11:46)
· Best Buy推出移动应用推荐平台(2011-10-21 11:43)
· A-Fund公布首批投资公司名单,乐元素、木瓜移动等7家公司入选(2011-10-21 11:42)
· 李开复 :马云不会真的收购或管理雅虎核心业务(2011-10-21 11:38)

编辑推荐:最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用50

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [xml to tree] 推荐:

XML to tree XML 树

- Bloger - 博客园-首页原创精华区
前面发了一个 html to tree 再发一个 xml to tree. 版权所有:版权所有(C) 2009. 文件名称:xml2tree.js. 完成日期:2009-12-22. 页:http://www.chaige.net */ var XML2Tree = function (ini) {.

xml sax解析

- - 移动开发 - ITeye博客
最近一直在做接口,主要用对xml的解析用的是sax,下面我对sax的几种写法做了一个测试:. System.out.println("耗时:"+(end-start));. System.out.println("当前 Java 虚拟机中的使用内存量:" + (freeMemory01-freeMemory02) + " 字节");.

jquery操作xml

- - CSDN博客Web前端推荐文章
jquery真的很强大,虽然一直在用jquery,不用一直都没有深入,这几天重新学习了一下,不得不感叹她的强大,已经让我深深入迷. 这里记录一下,她是怎么快速地操作xml的.. 这里我们有一个xml文件:. jquery如何操作呢,总的思想,就是和操作dom差不多的方法. 首先我们获取这个文件的内容:(我先引入jquery库哈).

JSON与XML

- - CSDN博客推荐文章
   目前,在web开发领域,主要的数据交换格式有XML和JSON,对于XML相信大家都很熟悉. XML不仅能处理数字和文字等经典的数据,还可以管理文件,格式化,图像,音频,视频,以及更多.  JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成. 如今,我们经常会面临创建数据文件时,JSON和XML之间的选择.

XML和JSON

- - 四火的唠叨
不久前看到一个讨论帖,说的是XML和JSON的比较,说着说着后来就变成了JSON到底比XML牛逼在哪里. 不吹不黑,客观地来比较一下二者的异同. 有的情况下是的,但也不一定,比较这样的片段:. 二者信息量几乎均等,XML看起来并不显得多么冗余. 有恰当的编辑器,二者都可以有比较美观的缩进表达. 当然,也有很多情况我们可以看到XML要比JSON啰嗦(有人说JSON是fat-free alternative to XML),比如XML写这样的东西:.

露天小便器P-tree

- Haitao - 设计|生活|发现新鲜
2011年丹麦洛斯基尔德音乐节吸引超过10万的游客,强大的人流量对城市的公共厕所的需求也提出了考验. 但丹麦的AANDEBOOM公司却巧妙的解决了这一问题. 他们设计了50个露天小便器,分别放在主会场附近的2个不同街道. 事实证明,它确实是成功的,有大量游客乐意使用它. 这小便器还有个可爱的名字,P-Tree,向大树尿尿,顿时想到小公狗,翘起腿朝树上尿尿哦.

emacs 新手必看: undo-tree

- leafduo - LinuxTOY
火星人都知道,emacs 只有 undo ,没有 redo ……或者说它有 redo,但是相当的诡异,套用一句经典台词就是: 猥琐,非常的猥琐. 简单的说,emacs 的 redo 就是 undo undo ,也就是传说中的负负得正. 可能有些 emacs 新手,还不知道怎么去操作,因为一般情况下,无论你 undo 多少次,都不会发生 redo 的现象.

Android PULL解析XML

- - CSDN博客移动开发推荐文章
int eventType = parser.getEventType();//产生第一个事件. while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件. String name = parser.getName();//获取解析器当前指向的元素的名称.

Android DOM解析XML

- - CSDN博客移动开发推荐文章
if(personChilds.item(y).getNodeType()==Node.ELEMENT_NODE){//判断当前节点是否是元素类型节点. 作者:jaycee110905 发表于2013-2-7 21:04:29 原文链接. 阅读:78 评论:0 查看评论.

[转][转]TokuDB中的COLA-Tree和TokuMax中的Fractal tree(分形树)

- - heiyeluren的blog(黑夜路人的开源世界)
TokuDB中的COLA-Tree.       目前无论是商业的SQL Server,还是开源的MySQL,都基本上还在用比较老的 B+Tree(SQL Server用的是标准的B-Tree)的索引结构. 从原理来说,B系列树在查询过程中应该是不会慢的,而主要问题就是出现在插入. B-Tree在插入的时候,如果是最后一个node,那么速度非常快,因为是顺序写.