Xpath in JavaScript (第一部分)
Xpath現在很少被我們使用,因為JSON現在很盛行。可是在XML做為數據交換格式的年代,Xpath在我們隨機訪問大的xml文檔結構的時候扮演著非常重要的位置。也許大家現在很多沒有注意到,DOM Level 3 XPath指定的接口已經被Firefox,Safari, Chrome, and Opera實現了。他們所實現的核心接口就是XPathEvaluator,它包含一些能夠使用xpath表達式進行工作的方法,最主要的方法就是evaluate(),它能夠接受五個參數1.xpath查詢字符串2.指明xpath查詢字符串應該從哪個節點開始3.命名空間解析器(稍後介紹)4.返回的結果類型5.返回的結果應該添加到那個對象上(很少被使用,因為結果主要通過evaluate()返回)。
主要有10中不同的返回類型。每一種就代表XPathResult對象的一個常量。
XPathResult.ANY_TYPE 適合於xpath表達式的數據類型
XPathResult.ANY_UNORDERED_NODE_TYPE 返回匹配節點的集合,順序可能和文檔中的不一樣。
XPathResult.BOOLEAN_TYPE 返回boolean類型
XPathResult.FIRST_ORDERED_NODE_TYPE 返回文檔中匹配節點的第一個節點。
XPathResult.NUMBER_TYPE 返回num類型
XPathResult.ORDERED_NODE_ITERATOR_TYPE返回匹配節點的集合,順序和文檔中的一樣
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE返回一個節點集合片段,在文檔外捕獲節點,這樣將來對文檔的任何修改不會影響節點集合。節點集合中的順序要和文檔中的一樣。
XPathResult.STRING_TYPE 返回一個string類型
XPathResult.UNORDERED_NODE_ITERATOR_TYPE 返回匹配節點的集合,順序可能和文檔中的不一樣。
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE 返回一個節點集合片段,在文檔外捕獲節點,這樣將來對文檔的任何修改不會影響節點集合。節點集合中的順序沒有必要和文檔中的一樣。
介紹了這麼多,那麼我們該如何使用這些api進行操作呢?
evaluate()函數返回的信息完全依賴於請求的結果類型。
為了執行xpath查詢,需要使用XPathEvaluator對象,你可以生成一個新的對象也可以使用內置的對象,如果生成一個新的對象就要初始化XPathEvaluator。
var evaluator = new XPathEvaluator(); //得到第一個div var result = evaluator.evaluate("//div", document.documentElement, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); alert("First div ID is " + result.singleNodeValue.id);
在Firefox, Safari, Chrome, and Opera,所有的文檔實例都實現了XPathEvaluator接口,這樣的話如果在HTML頁麵中執行的查詢的話,我們可以使用document.evaluate(),如果通過XMLHttpRequest或者其他機製得到XML文檔,evaluate()方法也可以使用,例如:
//get first div var result = document.evaluate("//div", document.documentElement, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); alert("First div ID is " + result.singleNodeValue.id);
下麵介紹兩種返回多節點的方式,還是先看看實例:
//get all divs - iterator style
var result = document.evaluate("//div", document.documentElement, null,
XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
if (result){
var node = result.iterateNext();
while(node) {
alert(node.id);
node = node.iterateNext();
}
}
//get all divs - SNAPSHOT style
var result = document.evaluate("//div", document.documentElement, null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
if (result){
for (var i=0, len=result.snapshotLength; i < len; i++) {
alert(result.snapshotItem(i).id);
}
}
最後更新:2017-04-02 03:42:36