JavaScript處理XML DOM、XPath和XSLT方法詳解
一、瀏覽器對XML DOM的支持
1、將XML解析為DOM文檔
跨瀏覽器把XML解析為DOM文檔:
這個(gè) parseXml()函數(shù)只接收一個(gè)參數(shù),即可解析的 XML 字符串。
function parseXml(xml) { var xmldom = null; if (typeof DOMParser != "undefined") { xmldom = (new DOMParser()).parseFromString(xml, "text/xml"); var errors = xmldom.getElementsByTagName("parsererror"); if (errors.length) { throw new Error("XML parsing error:" + errors[0].textContent); } } else if (typeof ActiveXObject != "undefined") { xmldom = createDocument(); xmldom.loadXML(xml); if (xmldom.parseError != 0) { throw new Error("XML parsing error: " + xmldom.parseError.reason); } } else { throw new Error("No XML parser available."); } return xmldom; }
2、將DOM文檔序列化為XML文檔
跨瀏覽器將DOM文檔序列化為XML文檔:
這個(gè) serializeXml()函數(shù)接收一個(gè)參數(shù),即要序列化的 XML DOM 文檔。
function serializeXml(xmldom) { if (typeof XMLSerializer != "undefined") { return (new XMLSerializer()).serializeToString(xmldom); } else if (typeof xmldom.xml != "undefined") { return xmldom.xml; } else { throw new Error("Could not serialize XML DOM."); } }
二、瀏覽器對XPath的支持
跨瀏覽器使用XPath:重新創(chuàng)建 selectSingleNode()和selectNodes()方法。
命名空間對象應(yīng)該是下面這種字面量的形式。
{ prefix1: "uri1", prefix2: "uri2", prefix3: "uri3" }
selectSingleNode和selectNodes函數(shù)接收三個(gè)參數(shù):上下文節(jié)點(diǎn)、 XPath表達(dá)式和可選的命名空間對象。
selectSingleNode:
function selectSingleNode(context, expression, namespaces) { var doc = (context.nodeType != 9 ? context.ownerDocument: context); if (typeof doc.evaluate != "undefined") { var nsresolver = null; if (namespaces instanceof Object) { nsresolver = function(prefix) { return namespaces[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") { //create namespace string if (namespaces instanceof Object) { var ns = ""; for (var prefix in namespaces) { 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."); } } //調(diào)用 var result = selectSingleNode(xmldom.documentElement, "wrox:book/wrox:author", { wrox: <a rel="external nofollow" rel="external nofollow" target="_blank">http://www.wrox.com/</a>}); alert(serializeXml(result));
selectNodes:
function selectNodes(context, expression, namespaces) { var doc = (context.nodeType != 9 ? context.ownerDocument: context); if (typeof doc.evaluate != "undefined") { var nsresolver = null; if (namespaces instanceof Object) { nsresolver = function(prefix) { return namespaces[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.selectNodes != "undefined") { //create namespace string if (namespaces instanceof Object) { var ns = ""; for (var prefix in namespaces) { if (namespaces.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."); } } //調(diào)用 var result = selectNodes(xmldom.documentElement, "wrox:book/wrox:author", {wrox: <a rel="external nofollow" rel="external nofollow" target="_blank">http://www.wrox.com/</a>}); alert(result.length);
三、瀏覽器對使用XSLT的支持
跨瀏覽器使用XSLT樣式表轉(zhuǎn)換XML文檔
這個(gè) transform()函數(shù)接收兩個(gè)參數(shù):要執(zhí)行轉(zhuǎn)換的上下文節(jié)點(diǎn)和 XSLT 文檔對象。
function transform(context, xslt) { if (typeof XSLTProcessor != "undefined") { var processor = new XSLTProcessor(); processor.importStylesheet(xslt); var result = processor.transformToDocument(context); return (new XMLSerializer()).serializeToString(result); } else if (typeof context.transformNode != "undefined") { return context.transformNode(xslt); } else { throw new Error("No XSLT processor available."); } }
到此這篇關(guān)于JavaScript處理XML DOM、XPath和XSLT的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
uniapp實(shí)現(xiàn)可以左右滑動(dòng)導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了uniapp 實(shí)現(xiàn)可以左右滑動(dòng)導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10JS+CSS實(shí)現(xiàn)模仿瀏覽器網(wǎng)頁字符查找功能的方法
這篇文章主要介紹了JS+CSS實(shí)現(xiàn)模仿瀏覽器網(wǎng)頁字符查找功能的方法,實(shí)例分析了javascript實(shí)現(xiàn)查找功能的樣式及相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02JS+CSS模擬可以無刷新顯示內(nèi)容的留言板實(shí)例
這篇文章主要介紹了JS+CSS模擬可以無刷新顯示內(nèi)容的留言板,涉及javascript操作dom元素、鼠標(biāo)事件及css樣式的技巧,需要的朋友可以參考下2015-03-03學(xué)習(xí)JavaScript設(shè)計(jì)模式之單例模式
這篇文章主要為大家介紹了JavaScript設(shè)計(jì)模式中的單例模式,對JavaScript設(shè)計(jì)模式感興趣的小伙伴們可以參考一下2016-01-01在Node.js中使用Javascript Generators詳解
下面小編就為大家?guī)硪黄贜ode.js中使用Javascript Generators詳解。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考2016-05-05javascript之通用簡單的table選項(xiàng)卡實(shí)現(xiàn)(二)
上篇中的選項(xiàng)卡存在這樣的問題:把邏輯封裝在table.js中,不夠靈活,也就是說如果某個(gè)選項(xiàng)卡是實(shí)現(xiàn)異步請求或者跳轉(zhuǎn),而非div的顯隱切換,那么就得修過table.js來達(dá)到目的,顯然不是我所需要的。2010-05-05