`
blueion
  • 浏览: 39640 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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)。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics