摘要:對(duì)于布爾值類型,如果至少有一個(gè)節(jié)點(diǎn)與表達(dá)式匹配,則求值結(jié)果返回,否則返回如果有節(jié)點(diǎn)匹配,則返回和方法以上輸出與語(yǔ)法匹配的節(jié)點(diǎn)數(shù)量默認(rèn)類型結(jié)果常量可以自動(dòng)確定返回結(jié)果的類型。
XPath是設(shè)計(jì)用來(lái)在DOM文檔中查找節(jié)點(diǎn)的一種手段,因而對(duì)XML的處理也很重要。很多瀏覽器實(shí)現(xiàn)了這個(gè)標(biāo)準(zhǔn),IE有自己的實(shí)現(xiàn)方式。
DOM3級(jí)XPath下面的代碼是用來(lái)檢測(cè)瀏覽器是否支持DOM3級(jí)的XPath:
var supportsXPath=document.implementation.hasFeature("XPath","3.0");
在DOM3級(jí)的XPath規(guī)范定義的類型中,最重要的兩個(gè)類型是
XPathEvaluator
XPathResult
XPathEvaluator用在特定的上下文中對(duì)XPath表達(dá)式的求值。這個(gè)類型由三個(gè)方法:
createExpression(expression,nsresolver):將XPath表達(dá)式及相應(yīng)的命名空間信息轉(zhuǎn)化成一個(gè)XPathExpression,這是查詢的編譯版。在多次使用同一個(gè)查詢時(shí)很有用。
createNSResolver(node):根據(jù)node的命名空間信息創(chuàng)建一個(gè)新的XPathNSResolver對(duì)象。在基于使用命名空間的XML文檔求值時(shí),需要使用XPathNSResolver對(duì)象。
evaluate(expression.context,nsresolver,type,result):在給定的上下文中基于特定的命名空間信息來(lái)對(duì)XPath求值,剩下的參數(shù)指定如何返回結(jié)果。
evaluate方法最常用。這個(gè)方法接收5個(gè)參數(shù):
XPath表達(dá)式
上下文節(jié)點(diǎn)
命名空間求解器
返回結(jié)果的類型和保存結(jié)果的XPathResult對(duì)象(通常是null,因?yàn)榻Y(jié)果會(huì)以函數(shù)值的形式返回)。
第三個(gè)參數(shù)只在XML代碼中使用了XML命名空間時(shí)有必要指定,如果沒(méi)使用,設(shè)置為null。
第四個(gè)參數(shù)的的取值范圍是下列的常量之一:
XPathResult.ANY_TYPE:返回與XPath表達(dá)式匹配的數(shù)據(jù)類型
XPathResult.NUMBER_TYPE:數(shù)字
XPathResult.STRING_TYPE:字符串
XPathResult.BOOLEAN_TYPE:布爾值
XPathResult.UNORDERED_NODE_ITERATOR_TYPE:無(wú)序的匹配節(jié)點(diǎn)集合
XPathResult.ORDERED_NODE_ITERATOR_TYPE:有序的節(jié)點(diǎn)匹配集合
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:無(wú)序的匹配節(jié)點(diǎn)快照集合
XPathResult.ORDERD_NODE_SNAPSHOT_TYPE:有序的匹配節(jié)點(diǎn)快照集合
XPathResult.ANY_UNORDERED_NODE_TYPE:返回匹配的節(jié)點(diǎn)集合,順序會(huì)與原文不一定一致。
XPathResult.FIRST_ORDERED_NODE_TYPE:返回一個(gè)節(jié)點(diǎn)的集合
指定的結(jié)果類型決定了如何取得結(jié)果的值。
var result = xmldom.evaluate("employee/name", xmldom.documentElement, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); if (result !== null) { var node = result.iterateNext(); while (node) { alert(node.tagName); node = result.iterateNext(); } }
上述代碼中返回的XPathResult點(diǎn)迭代器需要使用iterateNext()方法從節(jié)點(diǎn)中取得匹配的節(jié)點(diǎn)。
再舉個(gè)例子如:
var xmldom = null; var parser = new DOMParser(); xmldom = parser.parseFromString("","text/xml"); var result = xmldom.evaluate("/root/name", xmldom.documentElement, null, XPathResult.ORDERED_NODE_ITETATOR_TYPE, null); if (result !== null) { var node = result.iterateNext(); while (node) { console.log(node.innerHTML); node = result.iterateNext(); } } Oliver Troy
如果指定的是快照結(jié)果類型,就必須使用
snapshotItem()方法和
snapshotLength屬性。
如:
var result = xmldom.evaluate("employee/name", xmldom.documentElement, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); if (result !== null) { for (var i = 0, len = result.snapshotLength; i < len; i++) { alert(result.snapshotItem(i).tagName); } }
又如:
var xmldom = null; var parser = new DOMParser(); xmldom = parser.parseFromString("單節(jié)點(diǎn)結(jié)果", "text/xml"); var result = xmldom.evaluate("/root/name", xmldom.documentElement, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); if (result !== null) { for (var i = 0, len = result.snapshotLength; i < len; i++) { console.log(result.snapshotItem(i).innerHTML); }; } Oliver Troy
XPathResult.FIRST_ORDERED_NODE_TYPE會(huì)返回一個(gè)匹配的節(jié)點(diǎn),可以通過(guò)結(jié)果的singleNodeValue屬性來(lái)訪問(wèn)該節(jié)點(diǎn)。
var xmldom = null; var parser = new DOMParser(); xmldom = parser.parseFromString("", "text/xml"); var result = xmldom.evaluate("/root/name", xmldom.documentElement, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); console.log(result.singleNodeValue.innerHTML); //Oliver Oliver Troy
可以通過(guò)singleNodeValue屬性來(lái)訪問(wèn)該節(jié)點(diǎn)。
簡(jiǎn)單類型結(jié)果簡(jiǎn)單類型的結(jié)果分別會(huì)通過(guò)
booleanValue
numberValue
stringValue
來(lái)訪問(wèn)。
XPathResult.BOOLEAN_TYPE:對(duì)于布爾值類型,如果至少有一個(gè)節(jié)點(diǎn)與XPath表達(dá)式匹配,則求值結(jié)果返回true,否則返回false:
var xmldom = null; var parser = new DOMParser(); xmldom = parser.parseFromString("", "text/xml"); var result = xmldom.evaluate("/root/name", xmldom.documentElement, null, XPathResult.BOOLEAN_TYPE, null); console.log(result.booleanValue); //True Oliver Troy
如果有節(jié)點(diǎn)匹配"employee/name",則返回true;
XPathResult.NUMBER_TYPE和count()方法:var xmldom = null; var parser = new DOMParser(); xmldom = parser.parseFromString("", "text/xml"); var result = xmldom.evaluate("count(/root/name)", xmldom.documentElement, null, XPathResult.NUMBER_TYPE, null); console.log(result.numberValue); //2 Oliver Troy
以上輸出與XPath語(yǔ)法匹配的節(jié)點(diǎn)數(shù)量(2)
XPathResult.STRING_TYPE:var xmldom = null; var parser = new DOMParser(); xmldom = parser.parseFromString("默認(rèn)類型結(jié)果", "text/xml"); var result = xmldom.evaluate("/root/name", xmldom.documentElement, null, XPathResult.STRING_TYPE, null); console.log(result.stringValue); //Oliver Oliver Troy
XPathResult.ANY_TYPE常量
可以自動(dòng)確定返回結(jié)果的類型。
resultType屬性
可以檢測(cè)結(jié)果的類型。
如:
var xmldom = null; var parser = new DOMParser(); xmldom = parser.parseFromString("對(duì)使用命名空間的XML求值的方法:", "text/xml"); var result = xmldom.evaluate("/root/name", xmldom.documentElement, null, XPathResult.ANY_TYPE, null); if (result !== null) { switch (result.resultType) { case XPathResult.STRING_TYPE: console.log(result.stringValue); break; case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: var node = result.iterateNext(); while (node) { console.log(node.innerHTML); node = result.iterateNext(); } break; } } Oliver Troy
createNSResolver()方法
和創(chuàng)建一個(gè)函數(shù),兩種方法
通過(guò)createNSResolver(node)方法來(lái)創(chuàng)建XPathNSResolver對(duì)象, 然后再使用evaluate() 方法來(lái)獲取結(jié)果
如:
var nsresolver = xmldom.createNSResolver(xmldom.documentElement); var result = xmldom.evaluate("wrox:book/wrox:author", xmldom.documentElement, nsresolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); alert(result.snapshotLength);
定義一個(gè)函數(shù), 讓它接收一個(gè)命名空間前綴, 返回關(guān)聯(lián)的URI
如:
var neresolver = function(prefix) { switch (prefix) { case "wrox": return "http://www.wrox.com/"; //其他前綴 } } var result = xmldom.evaluate("count(wrox:book/wrox/author)", xmldom.documentElement, nsresolver, XPathResult.NUMBER_TYPE, null); alert(result.numberValue);跨瀏覽器使用XPath
第一個(gè)跨瀏覽器的方法是selectSingleNode(), 接收三個(gè)參數(shù): 上下文節(jié)點(diǎn), XPath表達(dá)式, 可選的命名空間
function selectSingleNode(context, expression, namespace) { var doc = (context.nodeType != 9 ? context.ownerDocument : context); if (typeof doc.evaluate != "umdefined") { var nsresolver = null; if (namespace instanceof Object) { nsresolver = function(prefix) { return namespace[prefix]; }; } var result = doc.evaluate(expression, context, nsresolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null); return (result !== null ? result.singleNodeValue : null); } else if (typeof context.selectSingleNode != "undefined") { if (namespace instanceof Object) { var ns = ""; for (var prefix in namespace) { if (namespaces.hasOwnProperty(prefix)) { ns += "xmlns:" + prefix + "="" + namespaces[prefix] + "" "; } } doc.setProperty("SelectionNamespaces": ns); } return context.selectSingleNode(expression); } else { throw new Error("no XPath engine found"); } }
下面是這個(gè)函數(shù)的使用示例:
var result = selectSingleNode(xmldom.documentElement, "wrox:book/wrox:author", { wrox: "http://www.wrox.com/" }); alert(serializeXml(result));
下面的函數(shù)是跨瀏覽器封裝的selectNodes()函數(shù), 這個(gè)函數(shù)接收與上一個(gè)函數(shù)有相同的三個(gè)參數(shù)。
function selectNodes(context, expression, namespace) { var doc = (context.nodeType != 9 ? context.ownerDocument : context); if (typeof doc.evaluate != "umdefined") { var nsresolver = null; if (namespace instanceof Object) { nsresolver = function(prefix) { return namespace[prefix]; }; } var result = doc.evaluate(expression, context, nsresolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); var nodes = new Array(); if (result !== null) { for (var i = 0, len = result.snapshotLength; i < len; i++) { nodes.push(result.snapshotItem(i)); } } return nodes; } else if (typeof context.selectSingleNode != "undefined") { if (namespace instanceof Object) { var ns = ""; for (var prefix in namespace) { if (namespace.hasOwnProperty(prefix)) { ns += "xmlns:" + prefix + "="" + namespaces[prefix] + "" "; } } doc.setProperty("SelectionNamespaces": ns); } var result = context.selectNodes(expression); var nodes = new Array(); for (var i = 0, len = result.length; i < len; i++) { nodes.push(result[i]); } return nodes; } else { throw new Error("no XPath engine found"); } }
下面是selectNodes() 方法的使用示例:
var result = selectNodes(xmldom.documentElement, "wrox:book/wrox:author", { wrox: "http://www.wrox.com/" }); alert(result.length);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/110342.html
摘要:對(duì)于布爾值類型,如果至少有一個(gè)節(jié)點(diǎn)與表達(dá)式匹配,則求值結(jié)果返回,否則返回如果有節(jié)點(diǎn)匹配,則返回和方法以上輸出與語(yǔ)法匹配的節(jié)點(diǎn)數(shù)量默認(rèn)類型結(jié)果常量可以自動(dòng)確定返回結(jié)果的類型。 XPath是設(shè)計(jì)用來(lái)在DOM文檔中查找節(jié)點(diǎn)的一種手段,因而對(duì)XML的處理也很重要。很多瀏覽器實(shí)現(xiàn)了這個(gè)標(biāo)準(zhǔn),IE有自己的實(shí)現(xiàn)方式。 DOM3級(jí)XPath 下面的代碼是用來(lái)檢測(cè)瀏覽器是否支持DOM3級(jí)的XPath: ...
摘要:中的它不是一種正式的規(guī)范,,是的另一表現(xiàn)形式。是第一個(gè)支持它的。主要的功能是用來(lái)將轉(zhuǎn)換為文檔。方法用于取得當(dāng)前參數(shù)的值,參數(shù)為命名空間和參數(shù)的內(nèi)部名稱。跨瀏覽器使用這個(gè)函數(shù)接收兩個(gè)參數(shù)要執(zhí)行轉(zhuǎn)換的上下文節(jié)點(diǎn)和文檔對(duì)象。 IE中的XSTL 它不是一種正式的規(guī)范,, 是XPath的另一表現(xiàn)形式。 IE是第一個(gè)支持它的。 簡(jiǎn)單的XSTL轉(zhuǎn)換 XML文檔的方式就是將它們分別加到一個(gè)DOM文檔中...
摘要:中的它不是一種正式的規(guī)范,,是的另一表現(xiàn)形式。是第一個(gè)支持它的。主要的功能是用來(lái)將轉(zhuǎn)換為文檔。方法用于取得當(dāng)前參數(shù)的值,參數(shù)為命名空間和參數(shù)的內(nèi)部名稱??鐬g覽器使用這個(gè)函數(shù)接收兩個(gè)參數(shù)要執(zhí)行轉(zhuǎn)換的上下文節(jié)點(diǎn)和文檔對(duì)象。 IE中的XSTL 它不是一種正式的規(guī)范,, 是XPath的另一表現(xiàn)形式。 IE是第一個(gè)支持它的。 簡(jiǎn)單的XSTL轉(zhuǎn)換 XML文檔的方式就是將它們分別加到一個(gè)DOM文檔中...
摘要:的的是一個(gè)內(nèi)存對(duì)象樹,在瀏覽器中只保存一份,的修改的內(nèi)容會(huì)直接反應(yīng)到瀏覽器中對(duì)象在眼中,是由不同類型的節(jié)點(diǎn)組成的,這些節(jié)點(diǎn)都屬性對(duì)象。那么,我們需要裝載服務(wù)器的文件或字符串到中的對(duì)象?,F(xiàn)在問(wèn)題就是,和的裝載方式是不一樣的。 什么是DOM? DOM(Document Object Model)文檔對(duì)象模型,是語(yǔ)言和平臺(tái)的中立接口。。 允許程序和腳本動(dòng)態(tài)地訪問(wèn)和更新文檔的內(nèi)容。 為什么要使...
摘要:的的是一個(gè)內(nèi)存對(duì)象樹,在瀏覽器中只保存一份,的修改的內(nèi)容會(huì)直接反應(yīng)到瀏覽器中對(duì)象在眼中,是由不同類型的節(jié)點(diǎn)組成的,這些節(jié)點(diǎn)都屬性對(duì)象。那么,我們需要裝載服務(wù)器的文件或字符串到中的對(duì)象?,F(xiàn)在問(wèn)題就是,和的裝載方式是不一樣的。 什么是DOM? DOM(Document Object Model)文檔對(duì)象模型,是語(yǔ)言和平臺(tái)的中立接口。。 允許程序和腳本動(dòng)態(tài)地訪問(wèn)和更新文檔的內(nèi)容。 為什么要使...
閱讀 4193·2022-09-16 13:49
閱讀 1415·2021-11-22 15:12
閱讀 1539·2021-09-09 09:33
閱讀 1052·2019-08-30 13:15
閱讀 1741·2019-08-29 15:30
閱讀 679·2019-08-27 10:52
閱讀 2653·2019-08-26 17:41
閱讀 1911·2019-08-26 12:11