JavaScript處理XML DOM、XPath和XSLT方法詳解

一、瀏覽器對(duì)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.");
}
}二、瀏覽器對(duì)XPath的支持
跨瀏覽器使用XPath:重新創(chuàng)建 selectSingleNode()和selectNodes()方法。
命名空間對(duì)象應(yīng)該是下面這種字面量的形式。
{
prefix1: "uri1",
prefix2: "uri2",
prefix3: "uri3"
}selectSingleNode和selectNodes函數(shù)接收三個(gè)參數(shù):上下文節(jié)點(diǎn)、 XPath表達(dá)式和可選的命名空間對(duì)象。
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);三、瀏覽器對(duì)使用XSLT的支持
跨瀏覽器使用XSLT樣式表轉(zhuǎn)換XML文檔
這個(gè) transform()函數(shù)接收兩個(gè)參數(shù):要執(zhí)行轉(zhuǎn)換的上下文節(jié)點(diǎn)和 XSLT 文檔對(duì)象。
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的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript?算法實(shí)現(xiàn)復(fù)寫0雙指針解法
這篇文章主要為大家介紹了JavaScript?算法?復(fù)寫0雙指針解法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
JS獲取填報(bào)擴(kuò)展單元格控件的值的解決辦法
這篇文章主要介紹了JS獲取填報(bào)擴(kuò)展單元格控件的值的解決辦法,需要的朋友可以參考下2017-07-07
javascript 漢字轉(zhuǎn)拼音實(shí)現(xiàn)代碼
主要是提前定義了很多文字,這樣的方法不是很是,如果庫(kù)中沒有這個(gè)詞,是看不到相關(guān)信息的。2009-12-12
js 解析 JSON 數(shù)據(jù)簡(jiǎn)單示例
這篇文章主要介紹了js 解析 JSON 數(shù)據(jù)的方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了js 解析 JSON 格式數(shù)據(jù)的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-04-04
Webpack常見靜態(tài)資源處理-模塊加載器(Loaders)+ExtractTextPlugin插件
這篇文章主要介紹了Webpack常見靜態(tài)資源處理-模塊加載器(Loaders)+ExtractTextPlugin插件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
weex slider實(shí)現(xiàn)滑動(dòng)底部導(dǎo)航功能
這篇文章主要為大家詳細(xì)介紹了weex slider實(shí)現(xiàn)滑動(dòng)底部導(dǎo)航功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
JavaScript面向?qū)ο蟪绦蛟O(shè)計(jì)中對(duì)象的定義和繼承詳解
這篇文章主要介紹了JavaScript面向?qū)ο蟪绦蛟O(shè)計(jì)中對(duì)象的定義和繼承,結(jié)合實(shí)例形式詳細(xì)分析了javascript面向?qū)ο蟪绦蛟O(shè)計(jì)中對(duì)象定義、繼承、屬性、方法、深拷貝等相關(guān)概念與操作技巧,需要的朋友可以參考下2019-07-07
微信小程序?qū)崿F(xiàn)客服功能(客服消息)的全過(guò)程
在最近做的微信小程序中需要實(shí)現(xiàn)一個(gè)自帶的客服功能,下面這篇文章主要給大家介紹了關(guān)于微信小程序?qū)崿F(xiàn)客服功能(客服消息)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12

