几个javascript处理xml的函数

简介: 今天用到javascript處理ajax返回的xml,又到了網找了一下,終於證實了自己之前想到的,已經有人做的解釋xml的js插件,不過,現在只用到簡單的xml處理,我也感覺這幾個函數很有用,轉貼一下。

今天用到javascript處理ajax返回的xml,又到了網找了一下,終於證實了自己之前想到的,已經有人做的解釋xml的js插件,不過,現在只用到簡單的xml處理,我也感覺這幾個函數很有用,轉貼一下。

 

==========  完美分界   =========

 

轉自:http://yeaha.javaeye.com/blog/179311

 

javascript处理xml的函数

用ajaxslt做过一个产品,感觉ajaxslt有各种好处,但是奈何js效率有限,最终还是回到使用浏览器自己的DOM实现上来。
重新学习浏览器DOM实现的过程中写了几个函数,在IE和FireFox上测试通过。
从效率测试上来看,这个代码比ajaxslt快差不多两个数量级,但问题就是浏览器的依赖性问题,好在我的目标仅仅是兼容IE6及以上版本、FireFox2及以上版本,问题不大
  1. // author: yangyi (yangyi.cn.gz@gmail.com)  
  2.   
  3. // Based on <http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247> (copy from ajaxslt)  
  4. var DOM_ELEMENT_NODE = 1;  
  5. var DOM_ATTRIBUTE_NODE = 2;  
  6. var DOM_TEXT_NODE = 3;  
  7. var DOM_CDATA_SECTION_NODE = 4;  
  8. var DOM_ENTITY_REFERENCE_NODE = 5;  
  9. var DOM_ENTITY_NODE = 6;  
  10. var DOM_PROCESSING_INSTRUCTION_NODE = 7;  
  11. var DOM_COMMENT_NODE = 8;  
  12. var DOM_DOCUMENT_NODE = 9;  
  13. var DOM_DOCUMENT_TYPE_NODE = 10;  
  14. var DOM_DOCUMENT_FRAGMENT_NODE = 11;  
  15. var DOM_NOTATION_NODE = 12;  
  16.   
  17. /** 
  18.  * http://developer.mozilla.org/en/docs/DOMParser 
  19.  * 接受一段xml,解析成为xml document对象 
  20.  * 调用时可用try{}catch(e){}捕捉错误,错误对象具有parser xml message属性 
  21.  * @param   {String}    xml string 
  22.  * @return  {Object}    xml document object 
  23.  */  
  24. function xmlDocument(/* String */xmlString){  
  25.     var doc = null;  
  26.   
  27.     if (window.ActiveXObject){  
  28.         var ActiveIds = ['MSXML2.XMLDOM''Microsoft.XMLDOM''MSXML.XMLDOM''MSXML3.XMLDOM'];  
  29.         for (var len = ActiveIds.length, i = 0; i < len; i++){  
  30.             var id = ActiveIds[i];  
  31.             try{  
  32.                 var doc = new ActiveXObject(id);  
  33.                 doc.async = false;  
  34.                 doc.setProperty('SelectionLanguage''XPath');  
  35.                 doc.loadXML(xmlString);  
  36.                 break;  
  37.             }catch (e){}finally{  
  38.                 if (doc && doc.parseError && doc.parseError.errorCode != 0){  
  39.                     throw {parser:'MSXML', message:doc.parseError.reason, xml:xmlString, func:'xmlDocument'};  
  40.                 }  
  41.             }  
  42.         }  
  43.     }else if (typeof DOMParser != 'undefined'){  
  44.         var parser = new DOMParser();  
  45.         var doc = parser.parseFromString(xmlString, 'text/xml');  
  46.         if (doc.documentElement.nodeName == 'parsererror'){  
  47.             throw {parser:'DOMParser', message:doc.documentElement.firstChild.nodeValue, xml:xmlString, func:'xmlDocument'};  
  48.         }  
  49.     }elsereturn false; }  
  50.   
  51.     return doc;  
  52. }  
  53.   
  54. /** 
  55.  * 获取指定节点或文档对象的xml内容 
  56.  * port from ajaxslt xmlText() 
  57.  * @param   {Object}    xml DOM Node or xml Document 
  58.  * @return  {String}    xml string 
  59.  */  
  60. function xmlText(/* Document|Element */node){  
  61.     if (typeof node == 'string'){ return node; }  
  62.   
  63.     if (node.innerXML){  
  64.         return node.innerXML;  
  65.     }else if (node.xml){  
  66.         return node.xml;  
  67.     }else if (typeof XMLSerializer != 'undefined'){  
  68.         return (new XMLSerializer()).serializeToString(node);  
  69.     }elsereturn false; }  
  70. }  
  71.   
  72. /** 
  73.  * 获取所有节点的内容 
  74.  * port from ajaxslt xmlValue() 
  75.  * @param   {Object}    xml DOM Node or xml Document 
  76.  * @return  {String} 
  77.  */  
  78. function xmlValue(/* Document|Element */node){  
  79.     var val = '';  
  80.     if (node.nodeType == DOM_TEXT_NODE ||  
  81.         node.nodeType == DOM_CDATA_SECTION_NODE ||  
  82.         node.nodeType == DOM_ATTRIBUTE_NODE){  
  83.         val += node.nodeValue;  
  84.     }else if (node.nodeType == DOM_ELEMENT_NODE ||  
  85.               node.nodeType == DOM_DOCUMENT_NODE ||  
  86.               node.nodeType == DOM_DOCUMENT_FRAGMENT_NODE){  
  87.         for (var len = node.childNodes.length, i = 0; i < len; i++){  
  88.             val += arguments.callee(node.childNodes[i]);  
  89.         }  
  90.     }  
  91.     return val;  
  92. }  
  93.   
  94. /** 
  95.  * 获取节点属性,以对象形式返回 
  96.  * @param   {Object} 
  97.  * @return  {Object} 
  98.  */  
  99. function xmlGetAttributes(/* Element */node){  
  100.     var result = {};  
  101.     var nodeMap = node.attributes;  
  102.     if (nodeMap){  
  103.         for (var len = nodeMap.length, i = 0; i < len; i++){  
  104.             var aNode = nodeMap.item(i);  
  105.             result[aNode.nodeName] = aNode.nodeValue;  
  106.         }  
  107.     }  
  108.     return result;  
  109. }  
  110.   
  111. /** 
  112.  * 设置节点属性 
  113.  * @param   {Object}    xml DOM Node 
  114.  * @param   {Object}    attribute data as object type 
  115.  * @return  {Void} 
  116.  */  
  117. function xmlSetAttributes(/* Element */node, /* Object */attributes){  
  118.     var attributes = attributes || {};  
  119.     for (key in attributes){  
  120.         node.setAttribute(key, attributes[key]);  
  121.     }  
  122. }  
  123.   
  124. /** 
  125.  * 使用xpath在xml树中查询 
  126.  * http://developer.mozilla.org/en/docs/Introduction_to_using_XPath_in_JavaScript 
  127.  * @param   {Object}    xml Document or xml DOM Node 
  128.  * @param   {String}    xpath query string 
  129.  * @param   {Boolean}   if set true, only return first result node 
  130.  * @return  {Mixed}     return array include all nodes or first node 
  131.  */  
  132. function xpathSelectNodes(/* Document|Element */root, /* String */query, /* Boolean */returnFirst){  
  133.     if (window.ActiveXObject){  
  134.         return returnFirst ? root.selectSingleNode(query) : root.selectNodes(query);  
  135.     }else if (document.evaluate){  
  136.         /** 
  137.          * DOMParser的return type有ordered和unordered两种 
  138.          * ordered会按照树中间的顺序排列结果,unordered不一定 
  139.          * 另外还有一种snapshots的,这种结果是树节点的一个clone 
  140.          * 也就是说,如果操作结果节点,原来的节点不会有改变 
  141.          * 这里使用非clone方式 
  142.          */  
  143.         var returnType = returnFirst ? XPathResult.FIRST_ORDERED_NODE_TYPE : XPathResult.ORDERED_NODE_ITERATOR_TYPE;  
  144.         var doc = (root.nodeType == DOM_DOCUMENT_NODE) ? root : root.ownerDocument;  
  145.         var root = (root.nodeType == DOM_DOCUMENT_NODE) ? root.documentElement : root;  
  146.         var result = doc.evaluate(query, root, null, returnType, null);  
  147.   
  148.         if (returnFirst){  
  149.             var nodes = result.singleNodeValue;  
  150.         }else{  
  151.             var nextNode = result.iterateNext();  
  152.             var nodes = [];  
  153.             while (nextNode){  
  154.                 nodes.push(nextNode);  
  155.                 nextNode = result.iterateNext();  
  156.             }  
  157.         }  
  158.     }  
  159.     return nodes;  
  160. }  
  161.   
  162. /** 
  163.  * http://developer.mozilla.org/en/docs/Transforming_XML_with_XSLT 
  164.  * http://developer.mozilla.org/en/docs/Using_the_Mozilla_JavaScript_interface_to_XSL_Transformations 
  165.  * @param   {Mixed}     source xml, xml string or xml Document or xml DOM Node 
  166.  * @param   {Mixed}     xslt style sheet, xml string or xml Document or xml DOM Node 
  167.  * @param   {Boolean}   if set true, return processed xml as Document 
  168.  * @return  {Mixed}     return string or Document 
  169.  */  
  170. function xsltProcess(/* String|Document|Element */srcDoc, /* String|Document|Element */stylesheet, /* Boolean */returnAsDoc){  
  171.     var returnAsDoc = (typeof returnAsDoc == 'undefined') ? false : returnAsDoc;  
  172.     try{  
  173.         var srcDoc = (typeof srcDoc == 'string') ? xmlDocument(srcDoc) : srcDoc;  
  174.         var stylesheet = (typeof stylesheet == 'string') ? xmlDocument(stylesheet) : stylesheet;  
  175.     }catch(e){ e.func = 'xsltProcess'throw e; }  
  176.   
  177.     if (typeof XSLTProcessor != 'undefined'){  
  178.         var processor = new XSLTProcessor();  
  179.         try{  
  180.             processor.importStylesheet(stylesheet);  
  181.             var dest = processor.transformToDocument(srcDoc);  
  182.             return returnAsDoc ? dest : xmlText(dest);  
  183.         }catch(e){ throw {func:'xsltProcess', processor:'XSLTProcessor', xml:xmlText(srcDoc), xslt:xmlText(stylesheet)}; }  
  184.     }else if (window.ActiveXObject){  
  185.         try{  
  186.             var dest = srcDoc.transformNode(stylesheet);  
  187.             return returnAsDoc ? xmlDocument(dest) : dest;  
  188.         }catch(e){ throw {func:'xsltProcess', processor:'MSXML', xml:xmlText(srcDoc), xslt:xmlText(stylesheet)}; }  
  189.     }  
  190.   
  191.     return false;  

相关文章
|
4天前
|
JavaScript 前端开发 Java
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
本文介绍了JavaScript中常用的函数和方法,包括通用函数、Global对象函数以及数组相关函数。详细列出了每个函数的参数、返回值及使用说明,并提供了示例代码。文章强调了函数的学习应结合源码和实践,适合JavaScript初学者和进阶开发者参考。
14 2
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
|
2天前
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
16天前
|
JavaScript 前端开发
JavaScript 函数语法
JavaScript 函数是使用 `function` 关键词定义的代码块,可在调用时执行特定任务。函数可以无参或带参,参数用于传递值并在函数内部使用。函数调用可在事件触发时进行,如用户点击按钮。JavaScript 对大小写敏感,函数名和关键词必须严格匹配。示例中展示了如何通过不同参数调用函数以生成不同的输出。
|
19天前
|
存储 JavaScript 前端开发
JS函数提升 变量提升
【10月更文挑战第6天】函数提升和变量提升是 JavaScript 语言的重要特性,但它们也可能带来一些困惑和潜在的问题。通过深入理解和掌握它们的原理和表现,开发者可以更好地编写和维护 JavaScript 代码,避免因不了解这些机制而导致的错误和不一致。同时,不断提高对执行上下文等相关概念的认识,将有助于提升对 JavaScript 语言的整体理解和运用能力。
|
27天前
|
JavaScript 前端开发
js教程——函数
js教程——函数
24 4
|
2月前
|
JavaScript 前端开发 安全
JavaScript函数详解
JavaScript函数的详细解析,包括函数的定义和调用方式(如一般格式、匿名函数、构造函数、自调用函数、箭头函数和严格模式)、函数参数(arguments对象、可变参数、默认参数值)、闭包的概念和应用实例。
JavaScript函数详解
|
27天前
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
15 2
|
29天前
|
JavaScript 前端开发 Java
【javaScript数组,函数】的基础知识点
【javaScript数组,函数】的基础知识点
22 5
|
29天前
|
JavaScript 前端开发
Node.js 函数
10月更文挑战第5天
19 3
|
1月前
|
前端开发 JavaScript
探索JavaScript函数基础
探索JavaScript函数基础
17 3