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

被折叠的 条评论
为什么被折叠?



