前段时间自己尝试了下重构XmlDom对象,但只限于同步方式读取,毕竟还是最初版本.
以下是写好的代码,注释不足恳请原谅!感兴趣的朋友给点意见啊~~^_^!
/*-----------------------------------------------
名称:重构XmlDom对象
实现目标:使重构后的XmlDom兼容IE浏览器,FireFox浏览器。
功能:包含selectNodes(),selectSigleNode()两大方法。
备注:此代码只是最初版本,已在IE6.0和FireFox下测试正常。
-------------------------------------------------*/
var net = new Object();//生成一个Object对象存放所有引用,以免出现重名的情况
net.XMLDOM = function(xmlStr,ns){
this.xmlStr = xmlStr;//XML文本
this.ns = ns;//XML中的命名空间
this.oXmlDom = this.createXMLDOM();//生成一个xmldom对象
}
net.XMLDOM.prototype.createXMLDOM = function(){
var oXmlDom = null;
//在IE浏览器下
if(window.ActiveXObject)
{
//生成XmlDom对象
var progIDs = ["Msxml2.DOMDocument.3.0","Msxml2.DOMDocument"];
for(var i = 0;i < progIDs.length;++i)
{
try
{
oXmlDom = new ActiveXObject(progIDs[i]);
}
catch(e)
{}
}
//载入XML文本
oXmlDom.loadXML(this.xmlStr);
//设置使用XPath语法
oXmlDom.setProperty("SelectionLanguage","XPath");
//设置命名空间
if(this.ns != null)
{
this.resetNS.call(this);
oXmlDom.setProperty("SelectionNamespaces",this.ns);
}
}
//在FF浏览器下
else if(DOMParser)
{
//载入XML文本以生成XmlDom对象
var oParser = new DOMParser();
oXmlDom = oParser.parseFromString(this.xmlStr,"text/xml");
//设置命名空间
if(this.ns != null)
{
this.resetNS.call(this);
}
}
return oXmlDom;
}
//设置XPath中命名空间的表示方式
net.XMLDOM.prototype.resetNS = function(){
var temArr = this.ns.split(" ");
//设置在IE浏览器下,XPath的命名空间的表示方式
if(window.ActiveXObject)
{
for(var i = 0;i<temArr.length;++i)
{
var tem = temArr[i].split("=");
temArr[i] = "xmlns:"+tem[0]+"=""+tem[1]+""";
}
this.ns = temArr.join(" ");
}
//设置在FF浏览器下,XPath中的命名空间的表示方式
else if(DOMParser)
{
theNS = new Array();
var tem = null;
for(var i = 0;i<temArr.length;++i)
{
tem = temArr[i].split("=");
theNS[tem[0]]=tem[1];
}
}
}
//给重构的xmldom添加selectNodes方法,返回一个节点数组
net.XMLDOM.prototype.selectNodes = function(xCmd){
var nodes = new Array();
//IE浏览器
if(window.ActiveXObject)
{
nodes = this.oXmlDom.selectNodes(xCmd);
}
//FF浏览器
else if(DOMParser)
{
var oEvaluator = new XPathEvaluator();
var xRes = null;
if(this.ns != null)
{
xRes = oEvaluator.evaluate(xCmd,this.oXmlDom.documentElement,net.XMLDOM.nsResolver,XPathResult.ANY_TYPE,null);
}
else
{
xRes = oEvaluator.evaluate(xCmd,this.oXmlDom.documentElement,null,XPathResult.ANY_TYPE,null);
}
if(xRes != null)
{
var node = xRes.iterateNext();
while(node != null)
{
nodes.append(node);
node = xRes.iterateNext();
}
}
}
return nodes;
}
//给重构的xmldom添加selectSigleNode方法,返回首个节点
net.XMLDOM.prototype.selectSigleNode=function(xCmd){
var nodes = this.selectNodes(xCmd);
return nodes[0];
}
//FF浏览器下的命名空间映射函数处理
var theNS = null;
net.XMLDOM.nsResolver=function(prefix){
return theNS[prefix];
}
//给Array添加append方法
Array.prototype.append = function(el){
this[this.length] = el;
}
//以下是测试用代码---------------------------------------------------------------------
function test()
{
var xmlStr = "<bookstore xmlns="http://ccniit.com"><book xmlns="http://sousou.com" category="烹饪"><title>家常菜精选1288例</title><author>傅培梅</author><year>2008</year><price>29.80</price></book></bookstore>";
var oXmlDom = new net.XMLDOM(xmlStr,"a=http://ccniit.com b=http://sousou.com");
var nodes = oXmlDom.selectNodes("/a:bookstore/b:book/b:title");
alert(nodes[0].childNodes[0].nodeValue);
}
window.onload=function(){
test();
}
//-------------------------------------------------------------------------------------
名称:重构XmlDom对象
实现目标:使重构后的XmlDom兼容IE浏览器,FireFox浏览器。
功能:包含selectNodes(),selectSigleNode()两大方法。
备注:此代码只是最初版本,已在IE6.0和FireFox下测试正常。
-------------------------------------------------*/
var net = new Object();//生成一个Object对象存放所有引用,以免出现重名的情况
net.XMLDOM = function(xmlStr,ns){
this.xmlStr = xmlStr;//XML文本
this.ns = ns;//XML中的命名空间
this.oXmlDom = this.createXMLDOM();//生成一个xmldom对象
}
net.XMLDOM.prototype.createXMLDOM = function(){
var oXmlDom = null;
//在IE浏览器下
if(window.ActiveXObject)
{
//生成XmlDom对象
var progIDs = ["Msxml2.DOMDocument.3.0","Msxml2.DOMDocument"];
for(var i = 0;i < progIDs.length;++i)
{
try
{
oXmlDom = new ActiveXObject(progIDs[i]);
}
catch(e)
{}
}
//载入XML文本
oXmlDom.loadXML(this.xmlStr);
//设置使用XPath语法
oXmlDom.setProperty("SelectionLanguage","XPath");
//设置命名空间
if(this.ns != null)
{
this.resetNS.call(this);
oXmlDom.setProperty("SelectionNamespaces",this.ns);
}
}
//在FF浏览器下
else if(DOMParser)
{
//载入XML文本以生成XmlDom对象
var oParser = new DOMParser();
oXmlDom = oParser.parseFromString(this.xmlStr,"text/xml");
//设置命名空间
if(this.ns != null)
{
this.resetNS.call(this);
}
}
return oXmlDom;
}
//设置XPath中命名空间的表示方式
net.XMLDOM.prototype.resetNS = function(){
var temArr = this.ns.split(" ");
//设置在IE浏览器下,XPath的命名空间的表示方式
if(window.ActiveXObject)
{
for(var i = 0;i<temArr.length;++i)
{
var tem = temArr[i].split("=");
temArr[i] = "xmlns:"+tem[0]+"=""+tem[1]+""";
}
this.ns = temArr.join(" ");
}
//设置在FF浏览器下,XPath中的命名空间的表示方式
else if(DOMParser)
{
theNS = new Array();
var tem = null;
for(var i = 0;i<temArr.length;++i)
{
tem = temArr[i].split("=");
theNS[tem[0]]=tem[1];
}
}
}
//给重构的xmldom添加selectNodes方法,返回一个节点数组
net.XMLDOM.prototype.selectNodes = function(xCmd){
var nodes = new Array();
//IE浏览器
if(window.ActiveXObject)
{
nodes = this.oXmlDom.selectNodes(xCmd);
}
//FF浏览器
else if(DOMParser)
{
var oEvaluator = new XPathEvaluator();
var xRes = null;
if(this.ns != null)
{
xRes = oEvaluator.evaluate(xCmd,this.oXmlDom.documentElement,net.XMLDOM.nsResolver,XPathResult.ANY_TYPE,null);
}
else
{
xRes = oEvaluator.evaluate(xCmd,this.oXmlDom.documentElement,null,XPathResult.ANY_TYPE,null);
}
if(xRes != null)
{
var node = xRes.iterateNext();
while(node != null)
{
nodes.append(node);
node = xRes.iterateNext();
}
}
}
return nodes;
}
//给重构的xmldom添加selectSigleNode方法,返回首个节点
net.XMLDOM.prototype.selectSigleNode=function(xCmd){
var nodes = this.selectNodes(xCmd);
return nodes[0];
}
//FF浏览器下的命名空间映射函数处理
var theNS = null;
net.XMLDOM.nsResolver=function(prefix){
return theNS[prefix];
}
//给Array添加append方法
Array.prototype.append = function(el){
this[this.length] = el;
}
//以下是测试用代码---------------------------------------------------------------------
function test()
{
var xmlStr = "<bookstore xmlns="http://ccniit.com"><book xmlns="http://sousou.com" category="烹饪"><title>家常菜精选1288例</title><author>傅培梅</author><year>2008</year><price>29.80</price></book></bookstore>";
var oXmlDom = new net.XMLDOM(xmlStr,"a=http://ccniit.com b=http://sousou.com");
var nodes = oXmlDom.selectNodes("/a:bookstore/b:book/b:title");
alert(nodes[0].childNodes[0].nodeValue);
}
window.onload=function(){
test();
}
//-------------------------------------------------------------------------------------