簡單了解JavaScript操作XPath的一些基本方法
Xpath現(xiàn)在很少被我們使用,因為JSON現(xiàn)在很盛行??墒窃赬ML做為數(shù)據(jù)交換格式的年代,Xpath在我們隨機(jī)訪問大的xml文檔結(jié)構(gòu)的時候扮演著非常重要的位置。也許大家現(xiàn)在很多沒有注意到,DOM Level 3 XPath指定的接口已經(jīng)被Firefox,Safari, Chrome, and Opera實現(xiàn)了。他們所實現(xiàn)的核心接口就是XPathEvaluator,它包含一些能夠使用xpath表達(dá)式進(jìn)行工作的方法,最主要的方法就是evaluate(),它能夠接受五個參數(shù)1.xpath查詢字符串2.指明xpath查詢字符串應(yīng)該從哪個節(jié)點開始3.命名空間解析器(稍后介紹)4.返回的結(jié)果類型5.返回的結(jié)果應(yīng)該添加到那個對象上(很少被使用,因為結(jié)果主要通過evaluate()返回)。
主要有10中不同的返回類型。每一種就代表XPathResult對象的一個常量。
- XPathResult.ANY_TYPE 適合于xpath表達(dá)式的數(shù)據(jù)類型
- XPathResult.ANY_UNORDERED_NODE_TYPE 返回匹配節(jié)點的集合,順序可能和文檔中的不一樣。
- XPathResult.BOOLEAN_TYPE 返回boolean類型
- XPathResult.FIRST_ORDERED_NODE_TYPE 返回文檔中匹配節(jié)點的第一個節(jié)點。
- XPathResult.NUMBER_TYPE 返回num類型
- XPathResult.ORDERED_NODE_ITERATOR_TYPE返回匹配節(jié)點的集合,順序和文檔中的一樣
- XPathResult.ORDERED_NODE_SNAPSHOT_TYPE返回一個節(jié)點集合片段,在文檔外捕獲節(jié)點,這樣將來對文檔的任何修改不會影響節(jié)點集合。節(jié)點集合中的順序要和文檔中的一樣。
- XPathResult.STRING_TYPE 返回一個string類型
- XPathResult.UNORDERED_NODE_ITERATOR_TYPE 返回匹配節(jié)點的集合,順序可能和文檔中的不一樣。
- XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE 返回一個節(jié)點集合片段,在文檔外捕獲節(jié)點,這樣將來對文檔的任何修改不會影響節(jié)點集合。節(jié)點集合中的順序沒有必要和文檔中的一樣。
介紹了這么多,那么我們該如何使用這些api進(jìn)行操作呢?
evaluate()函數(shù)返回的信息完全依賴于請求的結(jié)果類型。
為了執(zhí)行xpath查詢,需要使用XPathEvaluator對象,你可以生成一個新的對象也可以使用內(nèi)置的對象,如果生成一個新的對象就要初始化XPathEvaluator。
var evaluator = new XPathEvaluator(); //得到第一個div var result = evaluator.evaluate("http://div", document.documentElement, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); alert("First div ID is " + result.singleNodeValue.id);
在Firefox, Safari, Chrome, and Opera,所有的文檔實例都實現(xiàn)了XPathEvaluator接口,這樣的話如果在HTML頁面中執(zhí)行的查詢的話,我們可以使用document.evaluate(),如果通過XMLHttpRequest或者其他機(jī)制得到XML文檔,evaluate()方法也可以使用,例如:
//get first div var result = document.evaluate("http://div", document.documentElement, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); alert("First div ID is " + result.singleNodeValue.id);
下面介紹兩種返回多節(jié)點的方式,還是先看看實例:
//get all divs - iterator style var result = document.evaluate("http://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("http://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); } }
命名空間
如果你只是使用xpath在html文檔中簡單的查詢,evaluate()中的命名空間解析器參數(shù)一般為null,如果你傾向于使用xpath在包含命名空間的xml文檔中查詢,那么你應(yīng)該學(xué)會怎樣創(chuàng)建和使用命名空間解析器。
除了默認(rèn)的命名空間以外,每個命名空間URI都映射到一個指定的前綴。每一個命名空間解析器是為xpath引擎在命名空間前綴和命名空間uri之間進(jìn)行映射。有兩種生成命名空間解析器的方法,第一種如下:創(chuàng)建一個接受命名空間前綴作為參數(shù)的方法,然后返回對應(yīng)的url ,如下:
function resolver(prefix){ switch(prefix){ case "wrox": return "http://www.wrox.com/"; case "ncz": return "http://www.nczonline.net/"; default: return "http://www.yahoo.com/"; } }
第二種使用一個包含命名空間信息的節(jié)點,來生成一個命名空間解析器。
<books xmlns:wrox="http://www.wrox.com/" xmlns="http://www.amazon.com/"> <wrox:book>Professional JavaScript</book> </books>
<books>元素包含了所有的命名空間信息,你可以把這個節(jié)點的引用傳給XPathEvaluator對象的createNSResovler()方法,然后可以自動的得到一個命名空間解析器。
如:
var evaluator = new XPathEvaluator(); var resolver = evaluator.createNSResolver(xmldoc.documentElement);
使用上面的任意一個方法可以很容易的在含有命名空間xml文檔中進(jìn)行查詢。
var evaluator = new XPathEvaluator(); var resolver = evaluator.createNSResolver(xmldoc.documentElement); var result = evaluator.evaluate("wrox:book", xmldoc.documentElement, resolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null); if (result){ alert(result.singleNodeValue.firstChild.nodeValue); }
注意:如果你在含有命名空間的xml文當(dāng)中執(zhí)行查詢,不提供命名空間解析器,就會發(fā)生錯誤。
IE瀏覽器中對xpath的支持
IE8還沒有實現(xiàn)DOM Level 3 XPath中定義的接口,但是它對xpath也有一定的支持,IE中的xpath功能主要對xml文檔可用,對document的對象不可用。
在IE中生成xml文檔的方法:
function createDocument(){ if (typeof arguments.callee.activeXString != "string"){ var versions = ["MSXML2.DOMDocument.6.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument"]; for (var i=0,len=versions.length; i < len; i++){ try { var xmldom = new ActiveXObject(versions[i]); arguments.callee.activeXString = versions[i]; return xmldom; } catch (ex){ //skip } } } return new ActiveXObject(arguments.callee.activeXString); }
生成文檔對象以后,可以使用loadXML()方法加載內(nèi)容:
var xmldoc = createDocument(); xmldoc.loadXML("");
第二種方法通過XMLHttRequest對象進(jìn)行請求生成xml對象。
var xhr = new XMLHttpRequest(), xmldoc; xhr.open("get", "data.xml", true); xhr.onreadystatechange = function(){ if (xhr.readyState == 4){ if (xhr.status >= 200 && xhr.status < 300){ xmldoc = xhr.responseXML; } }; xhr.send(null);
第三種方法是使用<xml>標(biāo)簽,Microsoft把這種方法叫做xml數(shù)據(jù)島,如下:
<xml id="myXML" src="data.xml"></xml>
然后:
var xmldoc = document.getElementById("myXML").XMLDocument;
XPath支持:
在ie中的xml文檔對象對xpath進(jìn)行支持有兩個內(nèi)置方法:
selectSingleNode() and selectNodes(),每個方法都接受xpath表達(dá)式作為參數(shù),然后分別放回第一個匹配的節(jié)點和所有匹配的節(jié)點。
命名空間支持:
對于
<books xmlns:wrox="http://www.wrox.com/" xmlns="http://www.amazon.com/"> <wrox:book>Professional JavaScript</book>
</books>這段xml文檔,我們應(yīng)該使用下面的方法進(jìn)行查詢,即首先使用setProperty(),來設(shè)置xml文檔的命名空間。
xmldoc.setProperty("SelectionNamespaces", "xmlns:wrox='http://www.wrox.com/' xmlns='http://www.amazon.com/'"); var book = xmldoc.documentElement.selectSingleNode("wrox:book");
相關(guān)文章
JS+CSS實現(xiàn)網(wǎng)頁加載中的動畫效果
這篇文章主要為大家詳細(xì)介紹了JS+CSS實現(xiàn)網(wǎng)頁加載中的動畫效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10JavaScript asp.net 獲取當(dāng)前超鏈接中的文本
今天用到,不會。網(wǎng)上找到一個方法,趕快記下來??梢垣@取超鏈接的鏈接文本。2009-04-04layer實現(xiàn)關(guān)閉彈出層刷新父界面功能詳解
這篇文章主要介紹了layer實現(xiàn)關(guān)閉彈出層刷新父界面功能,結(jié)合實例形式分析了使用layui的layer在關(guān)閉彈出層時刷新父界面的常用實現(xiàn)技巧與相關(guān)操作注意事項,需要的朋友可以參考下2017-11-11ES6知識點整理之?dāng)?shù)組解構(gòu)和字符串解構(gòu)的應(yīng)用示例
這篇文章主要介紹了ES6知識點整理之?dāng)?shù)組解構(gòu)和字符串解構(gòu)的應(yīng)用,結(jié)合實例形式分析了ES6數(shù)組解構(gòu)和字符串解構(gòu)的實現(xiàn)方法及相關(guān)操作注意事項,需要的朋友可以參考下2019-04-04