JavaScript高级程序设计(第3版)学习笔记 第18章

第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);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值