在编写处理xml的网页时,经常为浏览器兼容性头疼。于是我将常用的xml操作封装为函数。经过一段时间的改进,现在已经很稳定了,用起来很舒服。
函数有——
xml_loadfile:xml同步/异步加载。
xml_transformnode:xsl转换。
xml_text:节点的文本。
selectsinglenode:根据xpath选择单个节点。
selectnodes:根据xpath选择多个节点。
全部代码(zyllibjs_xml.js)——
复制代码 代码如下:
/*
zyllibjs_xml
xml处理
@author zyl910
注意——
1. chrome 由于其安全机制限制, 不能读取本地文件。
reference
~~~~~~~~~
http://www.jinlie.net/?p=302
chrome浏览器加载xml文档
update
~~~~~~
[2011-11-02]
定义。
[2011-11-09]
xml_loadfile: 为回调函数加上iserror参数。
[2011-11-21]
selectsinglenode
selectnodes
*/
// 加载xml文件并返回xml文档节点
// return: 成功时返回一个对象(同步模式下返回xml文档对象,异步模式下返回操作对象),失败时返回空。
// xmlurl: xml文件的url。
// funcasync: 回调函数. function onload(xmldoc, iserror){ ... }
function xml_loadfile(xmlurl, funcasync)
{
var xmldoc = null;
var ischrome = false;
var asyncis = (null!=funcasync); // 是否是异步加载。当funcasync不为空时,使用异步加载,否则是同步加载。
// 检查参数
if (==xmlurl) return null;
if (asyncis)
{
if (function!=typeof(funcasync)) return null;
}
// 创建xml对象
try
{
xmldoc = new activexobject(microsoft.xmldom); // support ie
}
catch(ex)
{
}
if (null==xmldoc)
{
try
{
// support firefox, mozilla, opera, etc
xmldoc = document.implementation.createdocument(, , null); // 创建一个空的 xml 文档对象。
}
catch(ex)
{
}
}
if (null==xmldoc) return null;
// 加载xml文档
xmldoc.async = asyncis;
if (asyncis)
{
if(window.activexobject)
{
xmldoc.onreadystatechange = function(){
if(xmldoc.readystate == 4)
{
var iserror = false;
if (null!=xmldoc.parseerror)
{
iserror = (0!=xmldoc.parseerror.errorcode); // 0成功, 非0失败。
}
funcasync(xmldoc, iserror);
}
}
}
else
{
xmldoc.onload = function(){
funcasync(xmldoc, false);
}
}
}
try
{
xmldoc.load(xmlurl);
}
catch(ex)
{
// alert(ex.message) // 如果浏览器是chrome,则会catch这个异常:object # (a document) has no method load
ischrome = true;
xmldoc = null;
}
if (ischrome)
{
var xhr = new xmlhttprequest();
if (asyncis) // 异步
{
xhr.onreadystatechange = function(){
if(xhr.readystate == 4)
{
funcasync(xhr.responsexml, xhr.status != 200);
}
}
xhr.open(get, xmlurl, true);
try // 异步模式下,由回调函数处理错误。
{
xhr.send(null);
}
catch(ex)
{
funcasync(null, true);
return null;
}
return xhr; // 注意:返回的是xmlhttprequest。建议异步模式下仅用null测试返回值。
}
else // 同步
{
xhr.open(get, xmlurl, false);
xhr.send(null); // 同步模式下,由调用者处理异常
xmldoc = xhr.responsexml;
}
}
return xmldoc;
}
// 使用xslt把xml文档转换为一个字符串。
function xml_transformnode(xmldoc, xsldoc)
{
if (null==xmldoc) return ;
if (null==xsldoc) return ;
if (window.activexobject) // ie
{
return xmldoc.transformnode(xsldoc);
}
else // firefox, chrome
{
//定义xsltprocesor对象
var xsltprocessor=new xsltprocessor();
xsltprocessor.importstylesheet(xsldoc);
// transformtodocument方式
var result=xsltprocessor.transformtodocument(xmldoc);
var xmls=new xmlserializer();
var rt = xmls.serializetostring(result);
return rt;
}
}
// 得到节点的文本
function xml_text(xmlnode)
{
if (null==xmlnode) return ;
var rt;
if (window.activexobject) // ie
{
rt = xmlnode.text;
}
else
{
// firefox, chrome, ...
rt = xmlnode.textcontent;
}
if (null==rt) rt=xmlnode.nodevalue; // xml dom
return rt;
}
// 添加方法。为了兼容firefox、chrome。
if (!window.activexobject)
{
xmldocument.prototype.selectsinglenode = element.prototype.selectsinglenode = function (xpath)
{
var x = this.selectnodes(xpath)
if ( ! x || x.length return x[ 0 ];
}
xmldocument.prototype.selectnodes = element.prototype.selectnodes = function (xpath)
{
var xpe = new xpathevaluator();
var nsresolver = xpe.creatensresolver( this.ownerdocument == null?this.documentelement : this.ownerdocument.documentelement);
var result = xpe.evaluate(xpath, this , nsresolver, 0 , null );
var found = [];
var res;
while (res = result.iteratenext())
found.push(res);
return found;
}
}
chrome浏览器加载xml文档
chrome浏览器不支持load方法加载xml文档。网上找了下,需要如下解决:
复制代码 代码如下:
function loadxmldoc(xml_name)
{
var xmldoc;
try
{
xmldoc = new activexobject(microsoft.xmldom); // support ie
}
catch(e)
{
try
{
// support firefox, mozilla, opera, etc
xmldoc = document.implementation.createdocument(, , null) ;// 创建一个空的 xml 文档对象。
}
catch(e)
{
alert(e.message);
}
}
// 加载xml文档
try
{
xmldoc.async = false; // 关闭异步加载
xmldoc.load(xml_name);
}
catch(e)
{
// alert(e.message) 如果浏览器是chrome,则会catch这个异常:object # (a document) has no method load,所以,以下实现支持chrome加载xml文档(只是粗略的写下)
var xhr = new xmlhttprequest();
xhr.open(get, xml_name, false);
xhr.send(null);
xmldoc = xhr.responsexml.documentelement;
}
return xmldoc;
}
btw,各浏览器加载xml字符串也不同。
ie使用 loadxml() 方法来解析 xml 字符串:
复制代码 代码如下:
xmldoc.loadxml(xml_str);
firefox等使用domparser 对象解析xml字符串:
复制代码 代码如下:
var parsexml = new domparser();
var doc = parsexml.parsefromstring(xml_str,text/xml);