用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;
}
分享到:
相关推荐
一个简单的AJAX应用通常包括以下几个步骤: 1. **创建XMLHttpRequest对象**:用于发送HTTP请求和接收响应。 2. **设置回调函数**:指定当服务器返回数据时要执行的操作。 3. **发送请求**:将请求发送到服务器。 4....
根据给定的内容,我们可以分析出几个关键函数: 1. **`loadXML(xmlString)`**: - **功能**:该函数用于加载并解析XML字符串。 - **兼容性**:支持IE和Mozilla浏览器。 - 对于IE浏览器,尝试使用不同的版本的`...
我们将分为以下几个部分进行讲解: 1. **XML基础知识**:XML(Extensible Markup Language)是一种用于存储和传输结构化数据的标记语言。它通过标签定义元素和属性,使数据具有自我描述性。在JavaScript中,我们...
通过本文所提供的方法和示例,读者可以对如何使用JavaScript进行XML文件的读取操作有一个清晰的理解,进而在实际开发中应用这些知识,处理复杂的XML数据结构。希望本文所述对大家的JavaScript程序设计有所帮助。
JavaScript XML Tree的实现可能会涉及到以下几个关键技术点: - DOM操作:通过`document.createElement`、`appendChild`、`setAttribute`等DOM API创建和修改HTML元素。 - 事件处理:使用`addEventListener`或`...
在JavaScript函数中调用COM组件的属性和方法可以实现各种复杂的功能,例如数据交换、图像处理、音频处理等等。COM组件提供了一个强大且灵活的平台,可以满足各种需求。 在上面的示例代码中,我们使用了`setInterval...
加载 XML 文件主要涉及到以下几个步骤: 1. **创建 XML 对象**:根据浏览器类型选择合适的 XML 处理对象。 2. **加载 XML 文件**:通过 XML 对象加载指定路径的 XML 文件。 3. **解析 XML 数据**:对加载完成的 XML ...
这个过程分为几个步骤: 1. **加载XML**:首先,需要获取XML数据。如果XML文件与HTML文件在同一服务器上,可以使用`XMLHttpRequest`对象或者`fetch` API来异步加载XML文件。例如: ```javascript var xhr = new ...
为了将XML文件从JavaScript发送到ASP.NET,我们可以采用以下几种方法: 1. **XMLHttpRequest或Fetch API**:通过创建XMLHttpRequest对象或使用Fetch API,我们能发起一个HTTP请求,将XML数据作为请求体的一部分。...
PHP读取文件前几个字节 判断文件类型函数 PHP连接ACCESS PHP采集程序中常用的函数 PHP随机产生指定长度中文字符串 SMTP类 url地址参数加密 一些常用验证函数 下拉-单选框选择 创建多级目录 删除数组中相同...
JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,它主要负责处理客户端的交互和动态效果。在网页设计中,导航条是不可或缺的部分,它帮助用户轻松地在网站的各个部分之间切换。本文将深入探讨如何使用...
本文将深入探讨标题"几十个JavaScript例子"所涵盖的几个关键知识点。 1. **数字动态时钟**:JavaScript可以实时更新页面上的时间显示,创建一个数字动态时钟。通过`setInterval`函数定时调用一个函数来获取当前时间...
以上述内容为例,可以进一步延伸出在JavaScript中处理XML文件时需要注意的几个关键点: 1. 浏览器兼容性问题:由于早期浏览器和现代浏览器在DOM操作和XML处理上存在差异,因此在编写跨浏览器的代码时需要进行浏览器...
在"javascript的几个实用实例"中,可能包含对DOM的增删改查操作,例如,通过`document.getElementById`、`document.querySelector`或`document.querySelectorAll`获取元素,然后用`innerHTML`、`style`属性等修改...
这个过程可以分为几个步骤,下面将详细解释如何实现。 首先,你需要创建一个XMLHttpRequest对象,这是JavaScript中的一个内置对象,它允许浏览器异步与服务器进行通信。在IE6及以下版本中,你需要使用ActiveXObject...
本资源“几十个JavaScript的例子下载”提供了丰富的学习材料,帮助开发者从初学者逐步进阶为精通者。 在JavaScript的世界里,这些经典案例可能涵盖以下几个方面: 1. **基础语法**:包括变量声明(var、let、const...
"javascript100个小例子"这个资源集合了100个JavaScript编程的小实例,涵盖了各种操作和效果,非常适合初学者进行实践学习,同时也为项目开发提供了现成的代码片段。 在JavaScript的学习中,了解和掌握以下几个关键...
在开始介绍代码之前,需要了解几个关键知识点: 1. XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它具有自描述的特性,非常适合用于网络中传输和存储数据。 2. JavaScript 是一种轻量级的编程语言,...
XML-js库的工作原理主要包括以下几个步骤: 1. **XML解析**:库首先解析XML字符串,将其转化为DOM(Document Object Model)树结构。DOM是一种标准,允许程序和脚本动态更新、添加和改变HTML或XML文档的内容和结构...
在`xml2js-parser-master`压缩包中,通常包含以下几个部分: - `src`目录:源代码,包含`xml2js-parser`的核心实现。 - `dist`目录:编译后的文件,可以直接在浏览器环境或Node.js环境中使用。 - `README.md`:项目...