国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

簡(jiǎn)單了解JavaScript操作XPath的一些基本方法

2019-11-20 09:48:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

主要有10中不同的返回類(lèi)型。每一種就代表XPathResult對(duì)象的一個(gè)常量。

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

介紹了這么多,那么我們?cè)撊绾问褂眠@些api進(jìn)行操作呢?
evaluate()函數(shù)返回的信息完全依賴(lài)于請(qǐng)求的結(jié)果類(lèi)型。
為了執(zhí)行xpath查詢(xún),需要使用XPathEvaluator對(duì)象,你可以生成一個(gè)新的對(duì)象也可以使用內(nèi)置的對(duì)象,如果生成一個(gè)新的對(duì)象就要初始化XPathEvaluator。

var evaluator = new XPathEvaluator(); //得到第一個(gè)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頁(yè)面中執(zhí)行的查詢(xún)的話,我們可以使用document.evaluate(),如果通過(guò)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文檔中簡(jiǎn)單的查詢(xún),evaluate()中的命名空間解析器參數(shù)一般為null,如果你傾向于使用xpath在包含命名空間的xml文檔中查詢(xún),那么你應(yīng)該學(xué)會(huì)怎樣創(chuàng)建和使用命名空間解析器。
除了默認(rèn)的命名空間以外,每個(gè)命名空間URI都映射到一個(gè)指定的前綴。每一個(gè)命名空間解析器是為xpath引擎在命名空間前綴和命名空間uri之間進(jìn)行映射。有兩種生成命名空間解析器的方法,第一種如下:創(chuàng)建一個(gè)接受命名空間前綴作為參數(shù)的方法,然后返回對(duì)應(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/";   } } 

第二種使用一個(gè)包含命名空間信息的節(jié)點(diǎn),來(lái)生成一個(gè)命名空間解析器。

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

<books>元素包含了所有的命名空間信息,你可以把這個(gè)節(jié)點(diǎn)的引用傳給XPathEvaluator對(duì)象的createNSResovler()方法,然后可以自動(dòng)的得到一個(gè)命名空間解析器。
如:

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

使用上面的任意一個(gè)方法可以很容易的在含有命名空間xml文檔中進(jìn)行查詢(xú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í)行查詢(xún),不提供命名空間解析器,就會(huì)發(fā)生錯(cuò)誤。

IE瀏覽器中對(duì)xpath的支持
IE8還沒(méi)有實(shí)現(xiàn)DOM Level 3 XPath中定義的接口,但是它對(duì)xpath也有一定的支持,IE中的xpath功能主要對(duì)xml文檔可用,對(duì)document的對(duì)象不可用。
在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); } 

生成文檔對(duì)象以后,可以使用loadXML()方法加載內(nèi)容:

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

第二種方法通過(guò)XMLHttRequest對(duì)象進(jìn)行請(qǐng)求生成xml對(duì)象。

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文檔對(duì)象對(duì)xpath進(jìn)行支持有兩個(gè)內(nèi)置方法:
selectSingleNode() and selectNodes(),每個(gè)方法都接受xpath表達(dá)式作為參數(shù),然后分別放回第一個(gè)匹配的節(jié)點(diǎn)和所有匹配的節(jié)點(diǎn)。
命名空間支持:
對(duì)于

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

</books>這段xml文檔,我們應(yīng)該使用下面的方法進(jìn)行查詢(xún),即首先使用setProperty(),來(lái)設(shè)置xml文檔的命名空間。

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

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 青阳县| 曲麻莱县| 宜春市| 康定县| 璧山县| 曲麻莱县| 台中市| 华蓥市| 邯郸县| 大悟县| 利辛县| 汕尾市| 浦北县| 佛山市| 大冶市| 海伦市| 蛟河市| 九龙城区| 水富县| 当雄县| 北票市| 阳朔县| 彩票| 灌云县| 张家界市| 大宁县| 喀喇| 康保县| 敖汉旗| 汪清县| 铜鼓县| 广东省| 通化市| 从江县| 三明市| 香港| 巴彦县| 镇原县| 成武县| 南丹县| 上栗县|