XPath是設(shè)計用來在DOM文檔中查找節(jié)點的一種手段秧骑,因為對于xml而言,他查找節(jié)點是采用標(biāo)準(zhǔn)dom的方法蠕蚜,比較繁雜尚洽,所以XPath對于XML處理很重要。但是靶累,在DOM3級才首次實現(xiàn)了這個推薦不標(biāo)準(zhǔn)腺毫。IE8及以前采用IE特有的方法。
- IE中的Xpath
- 基本方式
在IE8之前的瀏覽器挣柬,XPath是采用內(nèi)置基于ActiveX的XML DOM文檔對象實現(xiàn)的潮酒,在每一個節(jié)點上提供了兩個方法:selectSingleNode()和selectNodes()
這兩個方法都會接受一個Xpath模式(也就是查找路徑)。
var xmlDom=getXMLDOM("<root><user id='5'>doo</user><user id='6'>Lee</user></root>");
var node=xmlDom.selectSingleNode("root/user");
alert(node.tagName)//user
var nodes=xmlDom.selectNodes("root/user");
alert(nodes.length)//2
特點:
1邪蛔、selectSingleNode()
被用來查找單一節(jié)點急黎。
2、selectNodes()
被用來查找符合路徑的一個nodelist店溢。
3、xmldom不僅是調(diào)用這兩個方法的對象委乌,也是參數(shù)路徑的上下文節(jié)點床牧。指向xml DOM對象,是root的上一層節(jié)點遭贸。類似于html中的document對象戈咳。注意:在使用上下文節(jié)點時,要與路徑配合好
var node=xmlDom.documentElement.selectSingleNode("user");
4、使用selectSingleNode()
查找的單一節(jié)點著蛙,其實是同一路徑下節(jié)點的第一個删铃。 - 常用語法
【查找同一路徑下的某個節(jié)點】
var node=xmlDom.selectSingleNode("root/user[1]");
【獲取節(jié)點內(nèi)的值】
var node=xmlDom.selectSingleNode("root/user/text()");
alert(node.nodeValue);
【不關(guān)心層次查詢】
查找的是xml文檔內(nèi)的user節(jié)點,不關(guān)心她在怎樣的上下文中踏堡,只要有就可以
var node=xmlDom.selectSingleNode("http://user");
是在root下不關(guān)心層次查找user
var node=xmlDom.selectSingleNode("root//user");
【查找屬性】
var node=xmlDom.selectSingleNode("root/user[@id='6']"); -
DOM3中的Xpath
規(guī)定了兩個重要類型XpathEvaluator和XpathResult猎唁。- 獲取單一節(jié)點
【方法1】
var eva=new XPathEvaluator();
var result=eva.evaluate('root/user',xmlDom,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
if(result!=null){
alert(serializeXML(result.singleNodeValue));
}
特點:
1、首先利用XPathEvaluator
顷蟆,創(chuàng)造一個實例诫隅,然后調(diào)用該實例的evaluate
方法,該方法可以根據(jù)參數(shù)返回節(jié)點情況或節(jié)點信息帐偎。
2逐纬、為該方法傳遞5個參數(shù),(XPath表達(dá)式削樊,上下文節(jié)點豁生,命名空間求解器(一般null),返回的結(jié)果類型漫贞,保存結(jié)果的XPathResult對象(null))
3甸箱、返回的結(jié)果類型有很多種,最常用的一個是:返回匹配的節(jié)點集合绕辖,另一個是:返回只包含一個節(jié)點的節(jié)點集合摇肌。
單一節(jié)點:XPathResult.FIRST_ORDERED_NODE_TYPE
節(jié)點集合:XPathResult.ORDERED_NODE_ITERATOR_TYPE
4、.singleNodeValue
可以通過結(jié)果的這個屬性來返回匹配節(jié)點
【方法2】
省去創(chuàng)建XPathEvaluator
對象仪际,而是直接調(diào)用xmlDom對象的evaluate
方法围小。 - 獲取節(jié)點集合
var eva=new XPathEvaluator();
var result=eva.evaluate('root/user',xmlDom,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
if(result!=null){
var nodes=[];
var node=result.iterateNext();
while(node!=null){
nodes.push(node);
node=result.iterateNext();
}
}
alert(serializeXML(nodes[1]));
【特點】
1、可以通過結(jié)果的.iterateNext()
這個方法返回遍歷節(jié)點對象树碱,
2肯适、通過while循環(huán),將節(jié)點集合放到一個數(shù)組中成榜。
- 獲取單一節(jié)點
跨瀏覽器方法
- 思考:
1框舔、XPath中,查找同一個路徑下的某個節(jié)點赎婚,IE是從0開始刘绣,DOM3是從1開始
2、dom3獨(dú)有的功能放棄挣输,為了保證跨瀏覽器
3纬凤、只獲取單一節(jié)點與節(jié)點列表即可,基本可以完成所有操作撩嚼。 - 方法
//跨瀏覽器單一節(jié)點
function selectSingleNode(xmlDom,xpath){
var node=null;
if(typeof xmlDom.evaluate!='undefined'){//DOM3
var pattern=/[(\d+)]/;
var flag=xpath.match(pattern);
var num=0;
if(flag!=null){
num=parseInt(RegExp.$1)+1;
xpath=xpath.replace(pattern,'['+num+']')
}
var result=xmlDom.evaluate(xpath,xmlDom,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
if(result!=null){
node=result.singleNodeValue;
}
}else if(typeof xmlDom.selectSingleNode!='undefined'){//IE
node=xmlDom.selectSingleNode(xpath);
}
return node;
}
//跨瀏覽器節(jié)點集合
function selectNodes(xmlDom,xpath){
var nodes=[];
if(typeof xmlDom.evaluate!='undefined'){//DOM3
var pattern=/[(\d+)]/;
var flag=xpath.match(pattern);
var num=0;
if(flag!=null){
num=parseInt(RegExp.$1)+1;
xpath=xpath.replace(pattern,'['+num+']')
}
var result=xmlDom.evaluate(xpath,xmlDom,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
if(result!=null){
var node=null;
while((node=result.iterateNext())!=null){
nodes.push(node);
}
}
}else if(typeof xmlDom.selectSingleNode!='undefined'){//IE
nodes=xmlDom.selectNodes(xpath);
}
return nodes;
}
var node=selectSingleNode(xmlDom,'root/user[0]')
var nodes=selectNodes(xmlDom,'root/user')
alert(serializeXML(nodes[1]))