前段时间自己尝试了下重构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();
}
// -------------------------------------------------------------------------------------