本帖最后由 leadergg 于 2010-03-06 20:29:52 编辑

解决方案 »

  1.   

        /**  
         * 返回节点类型,参数:  
         * @param {object} node:节点  
         * @return {string} 节点类型,为空则返回null  
         * 1-element  
         * 2-attribute  
         * 3-text  
         * 4-cdata  
         * 5-entity reference  
         * 6-entity  
         * 7-pi (processing instruction)  
         * 8-comment  
         * 9-document  
         * 10-document type  
         * 11-document fragment  
         * 12-notation  
         */  
        getNodeType : function (node) {   
            return node ? node.nodeType : null;   
        },   
           
        /**  
         * 创建节点,参数:  
         * @param {string} nodeName:节点名称,必填  
         * @param {string} text:节点文本,可为空  
         * @param {Object} attributes:属性值-JSON数组,可为空,例:{id:'id001',name:'name001'}  
         * @param {Object} node:要增加子节点的节点,为空则返回新建的节点  
         * @param {Boolean} cdata:是否生成带有CDATA区段的节点,true:生成,false:不生成  
         * @return {Object} 创建的节点,有异常则返回null  
         */  
        createNode: function(nodeName, text, attributes, node, cdata) {   
            if (this.isIE) {   
                //创建子接点   
                var childNode = this.xmlDoc.createElement(nodeName);   
                //创建文本节点   
                var textNode = cdata == true ? this.xmlDoc.createCDATASection(text) : this.xmlDoc.createTextNode(text);   
                childNode.appendChild(textNode);   
                //添加属性   
                for (var i in attributes) {   
                    this.createAttribute(childNode,i,attributes[i]);   
                };   
                   
                return node ? node.appendChild(childNode) : childNode;   
            } else {   
                alert('FF创建节点再说.');   
                return null;   
            }   
        },   
           
        /**  
         * 创建带CDATA区段的节点,参数:  
         * @param {string} nodeName:节点名称,必填  
         * @param {string} text:节点文本,可为空  
         * @param {Object} attributes:属性值-JSON数组,可为空,例:{id:'id001',name:'name001'}  
         * @param {Object} node:要增加子节点的节点,为空则返回新建的节点  
         */  
        createCDATANode: function(nodeName, text, attributes, node) {   
            this.createNode(nodeName, text, attributes, node, true);   
        },   
           
        /**  
         * 创建节点属性,参数:  
         * @param {Object} node:节点,必填  
         * @param {String} key:属性名,必填  
         * @param {Object} value:属性值,必填  
         * @param {Object} node:返回新增属性的节点  
         * @return {Object} 增加属性的节点,有异常则返回null  
         */  
        createAttribute: function(node, key, value) {   
            if (this.isIE) {   
                if(!key) return;   
                var attr = this.xmlDoc.createAttribute(key);   
                attr.value = value ? value : "";   
                node.setAttributeNode(attr);   
                return node;   
            } else {   
                alert('FF创建节点再说.');   
                return node;   
            }   
            return null;   
        },   
           
        /**  
         * 把节点加到根节点上,参数:  
         * @param {Object} node:节点  
         * @return {Object} 有异常则返回null  
         */  
        addNodeToRoot: function(node) {   
            if(!node) return null;   
            this.getRoot().appendChild(node);   
            return node;   
        },   
           
        /**  
         * 把节点加到另外节点上,参数:  
         * @param {Object} node:节点  
         */  
        addNode: function(node,childNode) {   
            return (node && childNode) ? node.appendChild(childNode) : false;   
        },   
           
        /**  
         * 从父节点移除节点自身,参数:  
         * @param {Object} newNode:要替换的节点  
         * @param {Object} oldNode:要被替换的节点  
         */  
        replaceChild: function(newNode, oldNode) {   
            var parentNode = oldNode.parentNode;   
            if(!newNode || !oldNode || !parentNode) return;   
            parentNode.replaceChild(newNode, oldNode);   
        },   
           
        /**  
         * 从父节点移除节点自身,参数:  
         * @param {Object} node:要移除的节点  
         */  
        removeChild: function(node) {   
            if(!node || !node.parentNode) return;   
            node.parentNode.removeChild(node);   
        },   
           
        /**  
         * 移除节点的所有子节点,参数:  
         * @param {Object} node:父节点  
         */  
        removeChildNodes: function(node) {   
            if (node && this.hasChildNodes(node)) {   
                var childNodes = node.childNodes;   
                for(var i = 0; i < childNodes.length; i++) {   
                    node.removeChild(childNodes[0]);   
                }   
            }   
        },   
           
        /**  
         * 设置节点属性值,不存在则新建,参数:  
         * @param {Object} node:要设置的节点  
         * @param {String} key:要设置的属性名  
         * @param {String} value:要设置的属性值  
         */  
        setAttribute: function(node, key, value) {   
            this.createAttribute(node, key, value);   
        },   
           
        /**  
         * 设置文本节点的文本,参数:  
         * @param {Object} node:要设置的节点  
         * @param {String} text:要设置的文本  
         */  
        setText: function(node, text) {   
            if(this.isTextNode(node)) node.text = text;   
        },   
           
        /**  
         * 在文本节点后面追加文本,参数:  
         * @param {Object} node:要设置的节点  
         * @param {String} text:要设置的文本  
         */  
        appendText: function(node, text) {   
            if(this.isTextNode(node)) node.appendData(text);   
        },   
           
           
        /**  
         * 输出xml,为空则输出根节点文本,参数:  
         * @param {Object} node:要输出的节点  
         */  
        toString: function(node) {   
            node = node ? node : this.xmlDoc.documentElement;   
            if (typeof node == 'string') return node;   
            return this.isIE ? node.xml : new XMLSerializer().serializeToString(node);   
        }   
    }  
    [/code]
      

  2.   

    测试的xml文件(book.xml):
    <?xml version="1.0" encoding="utf-8"?>  
     <root>  
        <book>  
            <name>西游记</name>  
            <author>吴承恩</author>  
        </book>  
        <book>  
            <name>红楼梦</name>  
            <author>曹雪芹</author>  
        </book>  
        <book>  
            <name>三国演义</name>  
            <author>  
                <name>施耐庵</name>  
                <sex>男</sex>  
            </author>  
        </book>  
        <book>  
            <name>水浒传</name>  
            <author>罗贯中</author>  
        </book>  
     </root>[code][code=HTML]
    <html>   
        <head>   
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">   
            <mce:script language="JavaScript" type="text/javascript" src="../Ext/ext-base.js" mce_src="Ext/ext-base.js"><!--   
               
    // --></mce:script>   
            <mce:script language="JavaScript" type="text/javascript" src="../Ext/ext-all.js" mce_src="Ext/ext-all.js"><!--   
               
    // --></mce:script>   
            <title>测试xml</title>   
            <mce:script src="XmlUtils.js" mce_src="XmlUtils.js"></mce:script>   
        </head>   
        <body>   
            <div id='xmlOpTest'></div>   
        </body>   
        <mce:script type="text/javascript"><!--   
                /**  
                 * config参数:xmlPath文件地址;dataType数据格式-json或arry,默认为array。  
                 */  
                var xmlUtils = new XmlUtils({xmlPath:"book.xml",dataType:'json'});   
                alert(xmlUtils.toString());   
                   
                var rs = xmlUtils.getNodesTextByName(['name','author']);   
                //把上面的dataType改为array或者不为json此处就能得到值   
                document.getElementById('xmlOpTest').innerHTML += '<br/>取得所有的文本节点的数组: '+rs + '<br/>';   
                //这里用了Ext的json解析工具 Ext.encode这个方法是把json对象转换为字符串。Ext.decode则相反,把json格式的字符串转换为json对象数组   
                document.getElementById('xmlOpTest').innerHTML += '<br/>取得所有的文本节点的JSON数组: '+Ext.encode(rs)+'<br/>';   
                   
                var root = xmlUtils.getRoot();   
                xmlUtils.createNode('publish', '中国电力出版社',{id:'id0001'},root);   
                xmlUtils.createCDATANode('publish', '中国&电力出版社',{},root);   
                //设置属性   
                xmlUtils.setAttribute(root,'testId','test');   
                //修改属性   
                xmlUtils.setAttribute(root,'testId','test0000000000');   
                alert(xmlUtils.toString(root));   
                xmlUtils.removeChild(xmlUtils.getNodesByXpath('//root/publish')[0]);   
                alert(xmlUtils.toString(root));   
                node = xmlUtils.getFirstChild();   
                document.getElementById('xmlOpTest').innerHTML += '<br/>判断是否有子节点: '+xmlUtils.hasChildNodes(node) + ' ------ 判断是否有属性:';//+ xmlUtils.hasAttributes(node) +'<br/>';   
                document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的第一个节点:   '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +' ======== 节点类型:' + xmlUtils.getNodeType(node) + '<br/>';   
                node = xmlUtils.getNextNode(node);   
                document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的第一个节点下一个节点:  '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +'<br/>';   
                node = xmlUtils.getLastChild();   
                document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的最后一个节点:      '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +'<br/>';   
                node = xmlUtils.getPreviousNode(node);   
                document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的最后一个前一个节点:   '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +'<br/>';   
                node = xmlUtils.getParentNode(node);   
                document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的父节点: '+ xmlUtils.toString(node) +'<br/>';   
                var nodes = xmlUtils.getChildNodes();   
                document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的所有子节点:   '+xmlUtils.toString(nodes)+'<br/>';   
                   
                node = xmlUtils.getNodesByXpath('//root/book/name',2);   
                document.getElementById('xmlOpTest').innerHTML += '<br/>根据xPath得到节点名称和文本值:    '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node)+'<br/>';   
                node = xmlUtils.getNodesByXpath('//root/book/author');   
                document.getElementById('xmlOpTest').innerHTML += '<br/>根据xPath得到节点名称和文本值:    '+xmlUtils.getTagName(node[0]) + "---" + xmlUtils.getText(node[0])+'<br/>';   
                   
                //得到修改后的文本节点   
                node = xmlUtils.getNodesByXpath('//root/publish',1);   
                node = xmlUtils.getFirstChild(node);   
                document.getElementById('xmlOpTest').innerHTML += '<br/>修改文本值前节点文本:   '+xmlUtils.getText(node);   
                xmlUtils.setText(node,"西游记后传");   
                document.getElementById('xmlOpTest').innerHTML += '-----修改文本值后节点文本: '+xmlUtils.getText(node);   
                xmlUtils.appendText(node,"之测试");   
                document.getElementById('xmlOpTest').innerHTML += '-----追加文本值后节点文本: '+xmlUtils.getText(node) + "<br/>";   
               
    // --></mce:script>   
    </html>上面的文件都上传了,下载地址 http://download.csdn.net/source/1708635
      

  3.   

    - -,需要這么麻煩么?把xml當做html的dom操作就行了啊
      

  4.   

    顶一下 我现在用js 解析xml 全部是创建MSXML4.DOMDocumen 写的不错 
      

  5.   

    不过ff浏览器上 支持不是很好 ie ok
      

  6.   

    xml也是一种dom,直接用dom操作就可以了。
    而且你也没做兼容性测试,所以,才说,没啥太大用处
      

  7.   

    ie only的东西确实没有多大的用处。
    我一般在开发中能不用xml就不用,
    因为兼容性处理太麻烦,我一般用
    json很方便