成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript JavaScript與XML——“XPath”的注意要點

wemallshop / 2983人閱讀

摘要:對于布爾值類型,如果至少有一個節(jié)點與表達式匹配,則求值結(jié)果返回,否則返回如果有節(jié)點匹配,則返回和方法以上輸出與語法匹配的節(jié)點數(shù)量默認類型結(jié)果常量可以自動確定返回結(jié)果的類型。

XPath是設(shè)計用來在DOM文檔中查找節(jié)點的一種手段,因而對XML的處理也很重要。很多瀏覽器實現(xiàn)了這個標準,IE有自己的實現(xiàn)方式。

DOM3級XPath

下面的代碼是用來檢測瀏覽器是否支持DOM3級的XPath:

var supportsXPath=document.implementation.hasFeature("XPath","3.0");

在DOM3級的XPath規(guī)范定義的類型中,最重要的兩個類型是

XPathEvaluator

XPathResult

XPathEvaluator用在特定的上下文中對XPath表達式的求值。這個類型由三個方法:

createExpression(expression,nsresolver):將XPath表達式及相應(yīng)的命名空間信息轉(zhuǎn)化成一個XPathExpression,這是查詢的編譯版。在多次使用同一個查詢時很有用。

createNSResolver(node):根據(jù)node的命名空間信息創(chuàng)建一個新的XPathNSResolver對象。在基于使用命名空間的XML文檔求值時,需要使用XPathNSResolver對象。

evaluate(expression.context,nsresolver,type,result):在給定的上下文中基于特定的命名空間信息來對XPath求值,剩下的參數(shù)指定如何返回結(jié)果。

evaluate方法最常用。這個方法接收5個參數(shù):

XPath表達式

上下文節(jié)點

命名空間求解器

返回結(jié)果的類型和保存結(jié)果的XPathResult對象(通常是null,因為結(jié)果會以函數(shù)值的形式返回)。

第三個參數(shù)只在XML代碼中使用了XML命名空間時有必要指定,如果沒使用,設(shè)置為null。
第四個參數(shù)的的取值范圍是下列的常量之一:

XPathResult.ANY_TYPE:返回與XPath表達式匹配的數(shù)據(jù)類型

XPathResult.NUMBER_TYPE:數(shù)字

XPathResult.STRING_TYPE:字符串

XPathResult.BOOLEAN_TYPE:布爾值

XPathResult.UNORDERED_NODE_ITERATOR_TYPE:無序的匹配節(jié)點集合

XPathResult.ORDERED_NODE_ITERATOR_TYPE:有序的節(jié)點匹配集合

XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:無序的匹配節(jié)點快照集合

XPathResult.ORDERD_NODE_SNAPSHOT_TYPE:有序的匹配節(jié)點快照集合

XPathResult.ANY_UNORDERED_NODE_TYPE:返回匹配的節(jié)點集合,順序會與原文不一定一致。

XPathResult.FIRST_ORDERED_NODE_TYPE:返回一個節(jié)點的集合

指定的結(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點迭代器需要使用iterateNext()方法從節(jié)點中取得匹配的節(jié)點。

再舉個例子如:

var xmldom = null;
var parser = new DOMParser();
xmldom = parser.parseFromString("OliverTroy","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();
    }
}

如果指定的是快照結(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("OliverTroy", "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);
    };
}
單節(jié)點結(jié)果

XPathResult.FIRST_ORDERED_NODE_TYPE會返回一個匹配的節(jié)點,可以通過結(jié)果的singleNodeValue屬性來訪問該節(jié)點。

var xmldom = null;
var parser = new DOMParser();
xmldom = parser.parseFromString("OliverTroy", "text/xml");
var result = xmldom.evaluate("/root/name", xmldom.documentElement, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
console.log(result.singleNodeValue.innerHTML); //Oliver

可以通過singleNodeValue屬性來訪問該節(jié)點。

簡單類型結(jié)果

簡單類型的結(jié)果分別會通過

booleanValue

numberValue

stringValue

來訪問。

XPathResult.BOOLEAN_TYPE

對于布爾值類型,如果至少有一個節(jié)點與XPath表達式匹配,則求值結(jié)果返回true,否則返回false:

var xmldom = null;
var parser = new DOMParser();
xmldom = parser.parseFromString("OliverTroy", "text/xml");
var result = xmldom.evaluate("/root/name", xmldom.documentElement, null, XPathResult.BOOLEAN_TYPE, null);
console.log(result.booleanValue); //True

如果有節(jié)點匹配"employee/name",則返回true;

XPathResult.NUMBER_TYPEcount()方法:
var xmldom = null;
var parser = new DOMParser();
xmldom = parser.parseFromString("OliverTroy", "text/xml");
var result = xmldom.evaluate("count(/root/name)", xmldom.documentElement, null, XPathResult.NUMBER_TYPE, null);
console.log(result.numberValue); //2

以上輸出與XPath語法匹配的節(jié)點數(shù)量(2)

XPathResult.STRING_TYPE
var xmldom = null;
var parser = new DOMParser();
xmldom = parser.parseFromString("OliverTroy", "text/xml");
var result = xmldom.evaluate("/root/name", xmldom.documentElement, null, XPathResult.STRING_TYPE, null);
console.log(result.stringValue); //Oliver
默認類型結(jié)果

XPathResult.ANY_TYPE常量

可以自動確定返回結(jié)果的類型。

resultType屬性

可以檢測結(jié)果的類型。

如:

var xmldom = null;
var parser = new DOMParser();
xmldom = parser.parseFromString("OliverTroy", "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;
    }
}
對使用命名空間的XML求值的方法:

createNSResolver()方法

和創(chuàng)建一個函數(shù),兩種方法

通過createNSResolver(node)方法來創(chuàng)建XPathNSResolver對象, 然后再使用evaluate() 方法來獲取結(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);

定義一個函數(shù), 讓它接收一個命名空間前綴, 返回關(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

第一個跨瀏覽器的方法是selectSingleNode(), 接收三個參數(shù): 上下文節(jié)點, XPath表達式, 可選的命名空間

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

下面是這個函數(shù)的使用示例:

var result = selectSingleNode(xmldom.documentElement, "wrox:book/wrox:author", {
    wrox: "http://www.wrox.com/"
});
alert(serializeXml(result));

下面的函數(shù)是跨瀏覽器封裝的selectNodes()函數(shù), 這個函數(shù)接收與上一個函數(shù)有相同的三個參數(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78726.html

相關(guān)文章

  • JavaScript JavaScriptXML——“XPath注意要點

    摘要:對于布爾值類型,如果至少有一個節(jié)點與表達式匹配,則求值結(jié)果返回,否則返回如果有節(jié)點匹配,則返回和方法以上輸出與語法匹配的節(jié)點數(shù)量默認類型結(jié)果常量可以自動確定返回結(jié)果的類型。 XPath是設(shè)計用來在DOM文檔中查找節(jié)點的一種手段,因而對XML的處理也很重要。很多瀏覽器實現(xiàn)了這個標準,IE有自己的實現(xiàn)方式。 DOM3級XPath 下面的代碼是用來檢測瀏覽器是否支持DOM3級的XPath: ...

    duan199226 評論0 收藏0
  • JavaScript JavaScriptXML——“XSLT”注意要點

    摘要:中的它不是一種正式的規(guī)范,,是的另一表現(xiàn)形式。是第一個支持它的。主要的功能是用來將轉(zhuǎn)換為文檔。方法用于取得當前參數(shù)的值,參數(shù)為命名空間和參數(shù)的內(nèi)部名稱。跨瀏覽器使用這個函數(shù)接收兩個參數(shù)要執(zhí)行轉(zhuǎn)換的上下文節(jié)點和文檔對象。 IE中的XSTL 它不是一種正式的規(guī)范,, 是XPath的另一表現(xiàn)形式。 IE是第一個支持它的。 簡單的XSTL轉(zhuǎn)換 XML文檔的方式就是將它們分別加到一個DOM文檔中...

    wupengyu 評論0 收藏0
  • JavaScript JavaScriptXML——“XSLT”注意要點

    摘要:中的它不是一種正式的規(guī)范,,是的另一表現(xiàn)形式。是第一個支持它的。主要的功能是用來將轉(zhuǎn)換為文檔。方法用于取得當前參數(shù)的值,參數(shù)為命名空間和參數(shù)的內(nèi)部名稱??鐬g覽器使用這個函數(shù)接收兩個參數(shù)要執(zhí)行轉(zhuǎn)換的上下文節(jié)點和文檔對象。 IE中的XSTL 它不是一種正式的規(guī)范,, 是XPath的另一表現(xiàn)形式。 IE是第一個支持它的。 簡單的XSTL轉(zhuǎn)換 XML文檔的方式就是將它們分別加到一個DOM文檔中...

    LeexMuller 評論0 收藏0
  • DOM【介紹、HTML中DOM、XMLDOM】

    摘要:的的是一個內(nèi)存對象樹,在瀏覽器中只保存一份,的修改的內(nèi)容會直接反應(yīng)到瀏覽器中對象在眼中,是由不同類型的節(jié)點組成的,這些節(jié)點都屬性對象。那么,我們需要裝載服務(wù)器的文件或字符串到中的對象?,F(xiàn)在問題就是,和的裝載方式是不一樣的。 什么是DOM? DOM(Document Object Model)文檔對象模型,是語言和平臺的中立接口。。 允許程序和腳本動態(tài)地訪問和更新文檔的內(nèi)容。 為什么要使...

    meislzhua 評論0 收藏0
  • DOM【介紹、HTML中DOM、XMLDOM】

    摘要:的的是一個內(nèi)存對象樹,在瀏覽器中只保存一份,的修改的內(nèi)容會直接反應(yīng)到瀏覽器中對象在眼中,是由不同類型的節(jié)點組成的,這些節(jié)點都屬性對象。那么,我們需要裝載服務(wù)器的文件或字符串到中的對象。現(xiàn)在問題就是,和的裝載方式是不一樣的。 什么是DOM? DOM(Document Object Model)文檔對象模型,是語言和平臺的中立接口。。 允許程序和腳本動態(tài)地訪問和更新文檔的內(nèi)容。 為什么要使...

    tomorrowwu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<