JavaScript的XPath

XPath是一种轻量级的解析XML方式,现在大部分浏览器没有完全支持W3C的DOM Level 3 XPath特性。但是如果只是在一般的场合使用,XPath也是一个快速,高效的解析XML的手段。

 

下面的代码在IE6、7,FF2、3,Chrome,Safari测试通过:

 

function XMLUtil(xmldoc){ //XMLUtil 对象
	this.xmlDom = null;
	this.isIE = false; 
	 
	this.setXmlDom = function(/*xmlString*/xmldoc){ 
		this._setXmlDom(xmldoc);
	}
        
        /*get an xml node*/
	this.getXmlItem = function(/*xml query path*/path,NSResolver){
       //return string

	 if(!NSResolver){ //支持nameSpace
	 	NSResolver = null;
	 }
		if (this.isIE) {
		 
			return this.xmlDom.selectSingleNode(path).text; 
		}else{
			var xmlEvaluator = new XPathEvaluator();
			var results = xmlEvaluator.evaluate(path,this.xmlDom.documentElement,NSResolver,XPathResult.STRING_TYPE,null);
			return results.stringValue;
		} 
	};
       
        /*get xml nodes*/

	this.getXmlItems = function(/*xml query path*/path,NSResolver){
	
       //return string Array
	 var xmlArray = [];
	 if(!NSResolver){
	 	NSResolver = null;
	 }
		if (this.isIE) {
			 
			var xmlItems = this.xmlDom.selectNodes(path);
			for (var i=0;i<xmlItems.length;i++){
				 
				xmlArray[i] = xmlItems.item(i).text;
			}
		}else{
			var xmlEvaluator = new XPathEvaluator();
			var results = xmlEvaluator.evaluate(path,this.xmlDom.documentElement,NSResolver,XPathResult.UNORDERED_NODE_ITERATOR_TYPE,null);
			var xmlItem = results.iterateNext();
			var i = 0;
			while(xmlItem){
				xmlArray[i] = xmlItem.textContent; 
				xmlItem = results.iterateNext();
				i++;
			}
		} 
		return xmlArray; 
	};
	/*
         * set the xml doc
        */
	this._setXmlDom = function(xmldoc){ 
		if (window.ActiveXObject)  {
			 
			 this.isIE = true;
		      try{ 
				var XmlDom = new ActiveXObject("Microsoft.XMLDOM");
				 
				XmlDom.loadXML(xmldoc);
				 }
			  catch (error){console.debug('xml parser error');}  
			  }
		else    {
			 this.isIE=false;  
			  var oParser = new DOMParser();
			  try{
			  	
			  var XmlDom = oParser.parseFromString(xmldoc,"text/xml"); 
			  
			  }catch (error){console.debug('xml parse error'+error.toString);}
			   }
			      
			   this.xmlDom = XmlDom;
};
}

调用代码:

 

var parser = new XMLUtil();
 
 parser.setXmlDom(/*String*/xml);
var cred = parser.getXmlItem("//root/branch/cred");

 如果需要支持nameSpace,则需要自定义一个namespace解析函数:

 

 var parser = new XMLUtil();
        parser.xmlDom = data;
        var ns = function NSResolver(prefix){
			if (prefix == 'serv') {
				return 'http://www.g.com/schemas/service';
			}else if (prefix == 'com') {
				return 'http://www.g.com/schemas/common';
			}else if(prefix =='meet') {
				return 'http://www.g.com/schemas/service/meeting';
            }else if(prefix == 'ep'){
            	return 'http://www.g.com/schemas/service/ep';
            }else if (prefix == 'xsi') {
            	return 'http://www.w3.org/2001/XMLSchema-instance';
            }
        }  

        var result = parser.getXmlItem("//serv:message/serv:header/serv:response/serv:result",ns);
    
  XPath的缺点是只能解析XMLDOM,不能解析HTML;它只提供最基本的解析XML功能(返回node和nodeSet)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值