第18章 JavaScript与XML
1.跨浏览器处理XML:
function parseXml(xml){
var xmldom = null;
if (typeof DOMParser != "undefined"){
//为了将 XML 解析为 DOM 文档,Firefox 引入了 DOMParser 类型;后来,IE9、Safari、Chrome 和 Opera 也支持了这个类型
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"){
//IE8 及之前版本
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;
}
这个 parseXml()函数只接收一个参数,即可解析的 XML 字符串。在使用这个函数解析 XML 字符串时,应该将它放在 try-catch 语句当中,以防发生错误。
var xmldom = null;
try {
xmldom = parseXml("<root><child/></root>");
} catch (ex){
alert(ex.message);
} //进一步处理
2.跨浏览器序列化 XML:这个 serializeXml()函数接收一个参数,即要序列化的 XML DOM 文档。
function serializeXml(xmldom){
if (typeof XMLSerializer != "undefined"){
//IE9+、Opera、Chrome 和 Safari 都支持了 XMLSerializer。
return (new XMLSerializer()).serializeToString(xmldom);
} else if (typeof xmldom.xml != "undefined"){
//IE8 及之前版本
return xmldom.xml;
} else {
throw new Error("Could not serialize XML DOM.");
}
}
3.XPath 是设计用来在 DOM 文档中查找节点的一种手段
- 跨浏览器的selectSingleNode()函数
-
/* 接收三个参数:上下文节点、XPath 表达式和可选的命名空间对象。命名空间对象应该是下面这种字面量的形式。 { prefix1: "uri1", prefix2: "uri2", prefix3: "uri3" } */ function selectSingleNode(context, expression, namespaces){ var doc = (context.nodeType != 9 ? context.ownerDocument : context); //是否支持 DOM3 级 XPath 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"){ // 针对 IE //创建命名空间字符串 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."); } } var result = selectSingleNode(xmldom.documentElement, "wrox:book/wrox:author", { wrox: "http://www.wrox.com/" }); alert(serializeXml(result));
- 跨浏览器的 selectNodes()函数
-
//接收三个参数:上下文节点、XPath 表达式和可选的命名空间对象。 function selectNodes(context, expression, namespaces){ var doc = (context.nodeType != 9 ? context.ownerDocument : context); if (typeof doc.evaluate != "undefined"){ //是否支持 DOM3 级 XPath 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"){ //针对 IE //创建命名空间字符串 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."); } } var result = selectNodes(xmldom.documentElement, "wrox:book/wrox:author", { wrox: "http://www.wrox.com/" }); alert(result.length);
4.XSLT 是与 XML 相关的一种技术,它利用 XPath 将文档从一种表现形式转换成另一种表现形式。
跨浏览器使用XSLT,可以在 IE、Firefox、Chrome、Safari 和 Opera 中使用。
//接收两个参数:要执行转换的上下文节点和 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") {
//IE
return context.transformNode(xslt);
} else {
throw new Error("No XSLT processor available.");
}
}
var result = transform(xmldom, xsltdom);