簡單瞭解JavaScript操作XPath的一些基本方法_javascript技巧

來源:互聯網
上載者:User

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);   } } 


命名空間
如果你只是使用xpath在html文檔中簡單的查詢,evaluate()中的命名空間解析器參數一般為null,如果你傾向於使用xpath在包含命名空間的xml文檔中查詢,那麼你應該學會怎樣建立和使用命名空間解析器。
除了預設的命名空間以外,每個命名空間URI都映射到一個指定的首碼。每一個命名空間解析器是為xpath引擎在命名空間首碼和命名空間uri之間進行映射。有兩種產生命名空間解析器的方法,第一種如下:建立一個接受命名空間首碼作為參數的方法,然後返回對應的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/";   } } 

第二種使用一個包含命名空間資訊的節點,來產生一個命名空間解析器。

<books xmlns:wrox="http://www.wrox.com/" xmlns="http://www.amazon.com/">   <wrox:book>Professional JavaScript</book> </books> 

<books>元素包含了所有的命名空間資訊,你可以把這個節點的引用傳給XPathEvaluator對象的createNSResovler()方法,然後可以自動的得到一個命名空間解析器。
如:

var evaluator = new XPathEvaluator(); var resolver = evaluator.createNSResolver(xmldoc.documentElement); 

使用上面的任意一個方法可以很容易的在含有命名空間xml文檔中進行查詢。

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文當中執行查詢,不提供命名空間解析器,就會發生錯誤。

IE瀏覽器中對xpath的支援
IE8還沒有實現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()方法載入內容:

var xmldoc = createDocument(); xmldoc.loadXML(""); 

第二種方法通過XMLHttRequest對象進行請求產生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>標籤,Microsoft把這種方法叫做xml資料島,如下:

<xml id="myXML" src="data.xml"></xml>

然後:

var xmldoc = document.getElementById("myXML").XMLDocument;

XPath支援:
在ie中的xml文檔對象對xpath進行支援有兩個內建方法:
selectSingleNode() and selectNodes(),每個方法都接受xpath運算式作為參數,然後分別放回第一個匹配的節點和所有匹配的節點。
命名空間支援:
對於

<books xmlns:wrox="http://www.wrox.com/" xmlns="http://www.amazon.com/">  <wrox:book>Professional JavaScript</book>

</books>這段xml文檔,我們應該使用下面的方法進行查詢,即首先使用setProperty(),來設定xml文檔的命名空間。

xmldoc.setProperty("SelectionNamespaces",  "xmlns:wrox='http://www.wrox.com/' xmlns='http://www.amazon.com/'");var book = xmldoc.documentElement.selectSingleNode("wrox:book");

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.