`
yeaha
  • 浏览: 50714 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

几个javascript处理xml的函数

阅读更多
用ajaxslt做过一个产品,感觉ajaxslt有各种好处,但是奈何js效率有限,最终还是回到使用浏览器自己的DOM实现上来。
重新学习浏览器DOM实现的过程中写了几个函数,在IE和FireFox上测试通过。
从效率测试上来看,这个代码比ajaxslt快差不多两个数量级,但问题就是浏览器的依赖性问题,好在我的目标仅仅是兼容IE6及以上版本、FireFox2及以上版本,问题不大

// author: yangyi (yangyi.cn.gz@gmail.com)

// Based on <http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247> (copy from ajaxslt)
var DOM_ELEMENT_NODE = 1;
var DOM_ATTRIBUTE_NODE = 2;
var DOM_TEXT_NODE = 3;
var DOM_CDATA_SECTION_NODE = 4;
var DOM_ENTITY_REFERENCE_NODE = 5;
var DOM_ENTITY_NODE = 6;
var DOM_PROCESSING_INSTRUCTION_NODE = 7;
var DOM_COMMENT_NODE = 8;
var DOM_DOCUMENT_NODE = 9;
var DOM_DOCUMENT_TYPE_NODE = 10;
var DOM_DOCUMENT_FRAGMENT_NODE = 11;
var DOM_NOTATION_NODE = 12;

/**
 * http://developer.mozilla.org/en/docs/DOMParser
 * 接受一段xml,解析成为xml document对象
 * 调用时可用try{}catch(e){}捕捉错误,错误对象具有parser xml message属性
 * @param   {String}    xml string
 * @return  {Object}    xml document object
 */
function xmlDocument(/* String */xmlString){
    var doc = null;

    if (window.ActiveXObject){
        var ActiveIds = ['MSXML2.XMLDOM', 'Microsoft.XMLDOM', 'MSXML.XMLDOM', 'MSXML3.XMLDOM'];
        for (var len = ActiveIds.length, i = 0; i < len; i++){
            var id = ActiveIds[i];
            try{
                var doc = new ActiveXObject(id);
                doc.async = false;
                doc.setProperty('SelectionLanguage', 'XPath');
                doc.loadXML(xmlString);
                break;
            }catch (e){}finally{
                if (doc && doc.parseError && doc.parseError.errorCode != 0){
                    throw {parser:'MSXML', message:doc.parseError.reason, xml:xmlString, func:'xmlDocument'};
                }
            }
        }
    }else if (typeof DOMParser != 'undefined'){
        var parser = new DOMParser();
        var doc = parser.parseFromString(xmlString, 'text/xml');
        if (doc.documentElement.nodeName == 'parsererror'){
            throw {parser:'DOMParser', message:doc.documentElement.firstChild.nodeValue, xml:xmlString, func:'xmlDocument'};
        }
    }else{ return false; }

    return doc;
}

/**
 * 获取指定节点或文档对象的xml内容
 * port from ajaxslt xmlText()
 * @param   {Object}    xml DOM Node or xml Document
 * @return  {String}    xml string
 */
function xmlText(/* Document|Element */node){
    if (typeof node == 'string'){ return node; }

    if (node.innerXML){
        return node.innerXML;
    }else if (node.xml){
        return node.xml;
    }else if (typeof XMLSerializer != 'undefined'){
        return (new XMLSerializer()).serializeToString(node);
    }else{ return false; }
}

/**
 * 获取所有节点的内容
 * port from ajaxslt xmlValue()
 * @param   {Object}    xml DOM Node or xml Document
 * @return  {String}
 */
function xmlValue(/* Document|Element */node){
    var val = '';
    if (node.nodeType == DOM_TEXT_NODE ||
        node.nodeType == DOM_CDATA_SECTION_NODE ||
        node.nodeType == DOM_ATTRIBUTE_NODE){
        val += node.nodeValue;
    }else if (node.nodeType == DOM_ELEMENT_NODE ||
              node.nodeType == DOM_DOCUMENT_NODE ||
              node.nodeType == DOM_DOCUMENT_FRAGMENT_NODE){
        for (var len = node.childNodes.length, i = 0; i < len; i++){
            val += arguments.callee(node.childNodes[i]);
        }
    }
    return val;
}

/**
 * 获取节点属性,以对象形式返回
 * @param   {Object}
 * @return  {Object}
 */
function xmlGetAttributes(/* Element */node){
    var result = {};
    var nodeMap = node.attributes;
    if (nodeMap){
        for (var len = nodeMap.length, i = 0; i < len; i++){
            var aNode = nodeMap.item(i);
            result[aNode.nodeName] = aNode.nodeValue;
        }
    }
    return result;
}

/**
 * 设置节点属性
 * @param   {Object}    xml DOM Node
 * @param   {Object}    attribute data as object type
 * @return  {Void}
 */
function xmlSetAttributes(/* Element */node, /* Object */attributes){
    var attributes = attributes || {};
    for (key in attributes){
        node.setAttribute(key, attributes[key]);
    }
}

/**
 * 使用xpath在xml树中查询
 * http://developer.mozilla.org/en/docs/Introduction_to_using_XPath_in_JavaScript
 * @param   {Object}    xml Document or xml DOM Node
 * @param   {String}    xpath query string
 * @param   {Boolean}   if set true, only return first result node
 * @return  {Mixed}     return array include all nodes or first node
 */
function xpathSelectNodes(/* Document|Element */root, /* String */query, /* Boolean */returnFirst){
    if (window.ActiveXObject){
        return returnFirst ? root.selectSingleNode(query) : root.selectNodes(query);
    }else if (document.evaluate){
        /**
         * DOMParser的return type有ordered和unordered两种
         * ordered会按照树中间的顺序排列结果,unordered不一定
         * 另外还有一种snapshots的,这种结果是树节点的一个clone
         * 也就是说,如果操作结果节点,原来的节点不会有改变
         * 这里使用非clone方式
         */
        var returnType = returnFirst ? XPathResult.FIRST_ORDERED_NODE_TYPE : XPathResult.ORDERED_NODE_ITERATOR_TYPE;
        var doc = (root.nodeType == DOM_DOCUMENT_NODE) ? root : root.ownerDocument;
        var root = (root.nodeType == DOM_DOCUMENT_NODE) ? root.documentElement : root;
        var result = doc.evaluate(query, root, null, returnType, null);

        if (returnFirst){
            var nodes = result.singleNodeValue;
        }else{
            var nextNode = result.iterateNext();
            var nodes = [];
            while (nextNode){
                nodes.push(nextNode);
                nextNode = result.iterateNext();
            }
        }
    }
    return nodes;
}

/**
 * http://developer.mozilla.org/en/docs/Transforming_XML_with_XSLT
 * http://developer.mozilla.org/en/docs/Using_the_Mozilla_JavaScript_interface_to_XSL_Transformations
 * @param   {Mixed}     source xml, xml string or xml Document or xml DOM Node
 * @param   {Mixed}     xslt style sheet, xml string or xml Document or xml DOM Node
 * @param   {Boolean}   if set true, return processed xml as Document
 * @return  {Mixed}     return string or Document
 */
function xsltProcess(/* String|Document|Element */srcDoc, /* String|Document|Element */stylesheet, /* Boolean */returnAsDoc){
    var returnAsDoc = (typeof returnAsDoc == 'undefined') ? false : returnAsDoc;
    try{
        var srcDoc = (typeof srcDoc == 'string') ? xmlDocument(srcDoc) : srcDoc;
        var stylesheet = (typeof stylesheet == 'string') ? xmlDocument(stylesheet) : stylesheet;
    }catch(e){ e.func = 'xsltProcess'; throw e; }

    if (typeof XSLTProcessor != 'undefined'){
        var processor = new XSLTProcessor();
        try{
            processor.importStylesheet(stylesheet);
            var dest = processor.transformToDocument(srcDoc);
            return returnAsDoc ? dest : xmlText(dest);
        }catch(e){ throw {func:'xsltProcess', processor:'XSLTProcessor', xml:xmlText(srcDoc), xslt:xmlText(stylesheet)}; }
    }else if (window.ActiveXObject){
        try{
            var dest = srcDoc.transformNode(stylesheet);
            return returnAsDoc ? xmlDocument(dest) : dest;
        }catch(e){ throw {func:'xsltProcess', processor:'MSXML', xml:xmlText(srcDoc), xslt:xmlText(stylesheet)}; }
    }

    return false;
}
4
0
分享到:
评论
3 楼 alhua 2009-05-08  
可否增加一个如何使用的列子!
2 楼 yzx99 2008-08-22  
代码写得太好了!
1 楼 xyz662 2008-05-22  
 

相关推荐

    AJAX(Asynchronous JavaScript and XML)技术

    一个简单的AJAX应用通常包括以下几个步骤: 1. **创建XMLHttpRequest对象**:用于发送HTTP请求和接收响应。 2. **设置回调函数**:指定当服务器返回数据时要执行的操作。 3. **发送请求**:将请求发送到服务器。 4....

    JS xml转json

    根据给定的内容,我们可以分析出几个关键函数: 1. **`loadXML(xmlString)`**: - **功能**:该函数用于加载并解析XML字符串。 - **兼容性**:支持IE和Mozilla浏览器。 - 对于IE浏览器,尝试使用不同的版本的`...

    JavaScript解析XML实现两级级联下拉列表

    我们将分为以下几个部分进行讲解: 1. **XML基础知识**:XML(Extensible Markup Language)是一种用于存储和传输结构化数据的标记语言。它通过标签定义元素和属性,使数据具有自我描述性。在JavaScript中,我们...

    JavaScript操作XML文件之XML读取方法

    通过本文所提供的方法和示例,读者可以对如何使用JavaScript进行XML文件的读取操作有一个清晰的理解,进而在实际开发中应用这些知识,处理复杂的XML数据结构。希望本文所述对大家的JavaScript程序设计有所帮助。

    javascript XML Tree

    JavaScript XML Tree的实现可能会涉及到以下几个关键技术点: - DOM操作:通过`document.createElement`、`appendChild`、`setAttribute`等DOM API创建和修改HTML元素。 - 事件处理:使用`addEventListener`或`...

    在javascript函数中调用com组件的属性和方法

    在JavaScript函数中调用COM组件的属性和方法可以实现各种复杂的功能,例如数据交换、图像处理、音频处理等等。COM组件提供了一个强大且灵活的平台,可以满足各种需求。 在上面的示例代码中,我们使用了`setInterval...

    javascript实现加载xml文件的方法.docx

    加载 XML 文件主要涉及到以下几个步骤: 1. **创建 XML 对象**:根据浏览器类型选择合适的 XML 处理对象。 2. **加载 XML 文件**:通过 XML 对象加载指定路径的 XML 文件。 3. **解析 XML 数据**:对加载完成的 XML ...

    JS读XML例子

    这个过程分为几个步骤: 1. **加载XML**:首先,需要获取XML数据。如果XML文件与HTML文件在同一服务器上,可以使用`XMLHttpRequest`对象或者`fetch` API来异步加载XML文件。例如: ```javascript var xhr = new ...

    JS传递XML文件

    为了将XML文件从JavaScript发送到ASP.NET,我们可以采用以下几种方法: 1. **XMLHttpRequest或Fetch API**:通过创建XMLHttpRequest对象或使用Fetch API,我们能发起一个HTTP请求,将XML数据作为请求体的一部分。...

    PHP函数库,PHP函数大全,PHP函数实例,PHP函数手册,PHP5函数库实例

    PHP读取文件前几个字节 判断文件类型函数 PHP连接ACCESS PHP采集程序中常用的函数 PHP随机产生指定长度中文字符串 SMTP类 url地址参数加密 一些常用验证函数 下拉-单选框选择 创建多级目录 删除数组中相同...

    几个JavaScript做的导航条源码

    JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,它主要负责处理客户端的交互和动态效果。在网页设计中,导航条是不可或缺的部分,它帮助用户轻松地在网站的各个部分之间切换。本文将深入探讨如何使用...

    几十个JavaScript例子

    本文将深入探讨标题"几十个JavaScript例子"所涵盖的几个关键知识点。 1. **数字动态时钟**:JavaScript可以实时更新页面上的时间显示,创建一个数字动态时钟。通过`setInterval`函数定时调用一个函数来获取当前时间...

    javascript实现加载xml文件的方法

    以上述内容为例,可以进一步延伸出在JavaScript中处理XML文件时需要注意的几个关键点: 1. 浏览器兼容性问题:由于早期浏览器和现代浏览器在DOM操作和XML处理上存在差异,因此在编写跨浏览器的代码时需要进行浏览器...

    几十个JavaScript例子下载

    在"javascript的几个实用实例"中,可能包含对DOM的增删改查操作,例如,通过`document.getElementById`、`document.querySelector`或`document.querySelectorAll`获取元素,然后用`innerHTML`、`style`属性等修改...

    javascript读取服务器端XML文件收集.pdf

    这个过程可以分为几个步骤,下面将详细解释如何实现。 首先,你需要创建一个XMLHttpRequest对象,这是JavaScript中的一个内置对象,它允许浏览器异步与服务器进行通信。在IE6及以下版本中,你需要使用ActiveXObject...

    几十个javascript的例子下载

    本资源“几十个JavaScript的例子下载”提供了丰富的学习材料,帮助开发者从初学者逐步进阶为精通者。 在JavaScript的世界里,这些经典案例可能涵盖以下几个方面: 1. **基础语法**:包括变量声明(var、let、const...

    javascript100个小例子

    "javascript100个小例子"这个资源集合了100个JavaScript编程的小实例,涵盖了各种操作和效果,非常适合初学者进行实践学习,同时也为项目开发提供了现成的代码片段。 在JavaScript的学习中,了解和掌握以下几个关键...

    javascript读取Xml文件做一个二级联动菜单示例

    在开始介绍代码之前,需要了解几个关键知识点: 1. XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它具有自描述的特性,非常适合用于网络中传输和存储数据。 2. JavaScript 是一种轻量级的编程语言,...

    前端开源库-xml-js

    XML-js库的工作原理主要包括以下几个步骤: 1. **XML解析**:库首先解析XML字符串,将其转化为DOM(Document Object Model)树结构。DOM是一种标准,允许程序和脚本动态更新、添加和改变HTML或XML文档的内容和结构...

    前端开源库-xml2js-parser

    在`xml2js-parser-master`压缩包中,通常包含以下几个部分: - `src`目录:源代码,包含`xml2js-parser`的核心实现。 - `dist`目录:编译后的文件,可以直接在浏览器环境或Node.js环境中使用。 - `README.md`:项目...

Global site tag (gtag.js) - Google Analytics