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)。