最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡單了解JavaScript操作XPath的一些基本方法

 更新時間:2016年06月03日 16:04:40   作者:slalx  
XPath構(gòu)建于XML之上,以表示路徑的方式來確定XML中元素位置,事實(shí)上并不是太常用,這里我們來簡單了解JavaScript操作XPath的一些基本方法

Xpath現(xiàn)在很少被我們使用,因?yàn)镴SON現(xiàn)在很盛行。可是在XML做為數(shù)據(jù)交換格式的年代,Xpath在我們隨機(jī)訪問大的xml文檔結(jié)構(gòu)的時候扮演著非常重要的位置。也許大家現(xiàn)在很多沒有注意到,DOM Level 3 XPath指定的接口已經(jīng)被Firefox,Safari, Chrome, and Opera實(shí)現(xiàn)了。他們所實(shí)現(xiàn)的核心接口就是XPathEvaluator,它包含一些能夠使用xpath表達(dá)式進(jìn)行工作的方法,最主要的方法就是evaluate(),它能夠接受五個參數(shù)1.xpath查詢字符串2.指明xpath查詢字符串應(yīng)該從哪個節(jié)點(diǎn)開始3.命名空間解析器(稍后介紹)4.返回的結(jié)果類型5.返回的結(jié)果應(yīng)該添加到那個對象上(很少被使用,因?yàn)榻Y(jié)果主要通過evaluate()返回)。

主要有10中不同的返回類型。每一種就代表XPathResult對象的一個常量。

  • XPathResult.ANY_TYPE     適合于xpath表達(dá)式的數(shù)據(jù)類型
  • XPathResult.ANY_UNORDERED_NODE_TYPE     返回匹配節(jié)點(diǎn)的集合,順序可能和文檔中的不一樣。
  • XPathResult.BOOLEAN_TYPE 返回boolean類型
  • XPathResult.FIRST_ORDERED_NODE_TYPE 返回文檔中匹配節(jié)點(diǎn)的第一個節(jié)點(diǎn)。
  • XPathResult.NUMBER_TYPE 返回num類型
  • XPathResult.ORDERED_NODE_ITERATOR_TYPE返回匹配節(jié)點(diǎn)的集合,順序和文檔中的一樣
  • XPathResult.ORDERED_NODE_SNAPSHOT_TYPE返回一個節(jié)點(diǎn)集合片段,在文檔外捕獲節(jié)點(diǎn),這樣將來對文檔的任何修改不會影響節(jié)點(diǎn)集合。節(jié)點(diǎn)集合中的順序要和文檔中的一樣。
  • XPathResult.STRING_TYPE 返回一個string類型
  • XPathResult.UNORDERED_NODE_ITERATOR_TYPE 返回匹配節(jié)點(diǎn)的集合,順序可能和文檔中的不一樣。
  • XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE 返回一個節(jié)點(diǎn)集合片段,在文檔外捕獲節(jié)點(diǎn),這樣將來對文檔的任何修改不會影響節(jié)點(diǎn)集合。節(jié)點(diǎn)集合中的順序沒有必要和文檔中的一樣。

介紹了這么多,那么我們該如何使用這些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,所有的文檔實(shí)例都實(shí)現(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é)點(diǎn)的方式,還是先看看實(shí)例:

//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é)點(diǎn),來生成一個命名空間解析器。

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

<books>元素包含了所有的命名空間信息,你可以把這個節(jié)點(diǎn)的引用傳給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還沒有實(shí)現(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é)點(diǎn)和所有匹配的節(jié)點(diǎn)。
命名空間支持:
對于

<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)文章

  • 微信小程序onShareTimeline()實(shí)現(xiàn)分享朋友圈

    微信小程序onShareTimeline()實(shí)現(xiàn)分享朋友圈

    這篇文章主要給大家介紹了關(guān)于微信小程序onShareTimeline()實(shí)現(xiàn)分享朋友圈的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 前端技巧之js-md5的簡單使用方法

    前端技巧之js-md5的簡單使用方法

    這篇文章主要給大家介紹了關(guān)于前端技巧之js-md5的簡單使用,js-md5是一種前端加密算法,用于在前端對密碼等敏感信息進(jìn)行加密,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • js遍歷json對象所有key及根據(jù)動態(tài)key獲取值的方法(必看)

    js遍歷json對象所有key及根據(jù)動態(tài)key獲取值的方法(必看)

    下面小編就為大家?guī)硪黄猨s遍歷json對象所有key及根據(jù)動態(tài)key獲取值的方法(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • JavaScript Event學(xué)習(xí)第八章 事件的順序

    JavaScript Event學(xué)習(xí)第八章 事件的順序

    在第一章中我提到一個初次看起來可能不是那么好理解的是一個問題:“如果一個元素和他的父元素對于同樣的事件都有事件處理程序,那么哪個會首先執(zhí)行呢?”毫無疑問,看是什么瀏覽器。
    2010-02-02
  • JavaScript中發(fā)出HTTP請求最常用的方法

    JavaScript中發(fā)出HTTP請求最常用的方法

    JavaScript具有很好的模塊和方法來發(fā)送可用于從服務(wù)器端資源發(fā)送或接收數(shù)據(jù)的HTTP請求。這篇文章主要介紹了JavaScript中發(fā)出HTTP請求最常用的方法,需要的朋友可以參考下
    2018-07-07
  • JavaScript 自動完成腳本整理(33個)

    JavaScript 自動完成腳本整理(33個)

    所謂的提升用戶體驗(yàn),其實(shí)就是把所有用戶視為懶鬼,比如JavaScript自動完成(Autocomplete)腳本, 常用于表單,用戶只需輸入一兩個字母,就為你擴(kuò)展、聯(lián)想、匹配和供君選擇,
    2009-10-10
  • 5個JavaScript經(jīng)典面試題

    5個JavaScript經(jīng)典面試題

    這篇文章主要介紹了5個JavaScript經(jīng)典面試題,這些面試題可能在各種公司的javascript面試中都會出現(xiàn),需要的朋友可以參考下
    2014-10-10
  • layer ui 導(dǎo)入文件之前傳入數(shù)據(jù)的實(shí)例

    layer ui 導(dǎo)入文件之前傳入數(shù)據(jù)的實(shí)例

    今天小編就為大家分享一篇layer ui 導(dǎo)入文件之前傳入數(shù)據(jù)的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 谷歌showModalDialog()方法不兼容出現(xiàn)對話窗口的解決辦法

    谷歌showModalDialog()方法不兼容出現(xiàn)對話窗口的解決辦法

    這篇文章給大家介紹了谷歌showModalDialog()方法不兼容出現(xiàn)對話窗口的解決辦法,解決辦法非常好,感興趣的朋友可以參考下
    2016-02-02
  • document.onreadystatechange事件的用法分析

    document.onreadystatechange事件的用法分析

    這里主要介紹document.onreadystatechange事件的使用方法, 一般多用于實(shí)時監(jiān)控用戶的輸入
    2009-10-10

最新評論

深泽县| 大同县| 基隆市| 浪卡子县| 遵义市| 铅山县| 高邑县| 泰和县| 龙游县| 沅江市| 右玉县| 额敏县| 长治市| 图木舒克市| 交城县| 常熟市| 遵化市| 小金县| 长武县| 西畴县| 红河县| 五家渠市| 桃园市| 荔波县| 毕节市| 望都县| 板桥市| 清丰县| 建宁县| 荥阳市| 达拉特旗| 阳朔县| 安国市| 五原县| 镇安县| 新竹县| 兰西县| 宿松县| 师宗县| 含山县| 五河县|