zoukankan      html  css  js  c++  java
  • JavaScript(24):处理XML DOM、XPath和XSLT

    一、浏览器对XML DOM的支持

    1、将XML解析为DOM文档

    跨浏览器把XML解析为DOM文档:

    这个 parseXml()函数只接收一个参数,即可解析的 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文档:

    这个 serializeXml()函数接收一个参数,即要序列化的 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:重新创建 selectSingleNode()和selectNodes()方法。

    命名空间对象应该是下面这种字面量的形式。

    {
        prefix1: "uri1",
        prefix2: "uri2",
        prefix3: "uri3"
    }

    selectSingleNode和selectNodes函数接收三个参数:上下文节点、 XPath表达式和可选的命名空间对象。

    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.");
        }
    }
    //调用
    var result = selectSingleNode(xmldom.documentElement, "wrox:book/wrox:author", { wrox: http://www.wrox.com/});
    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.");
        }
    }
    //调用
    var result = selectNodes(xmldom.documentElement, "wrox:book/wrox:author", {wrox: http://www.wrox.com/});
    alert(result.length);

    三、浏览器对使用XSLT的支持

    跨浏览器使用XSLT样式表转换XML文档

    这个 transform()函数接收两个参数:要执行转换的上下文节点和 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.");
        }
    }
  • 相关阅读:
    leetcode_268.missing number
    leetcode_41. First Missing Positive_cyclic swapping
    cyclic swapping algorithm
    leetcode_919. Complete Binary Tree Inserter_完全二叉树插入
    前端的图片隐写术
    C#读取串口数据实现无线手柄操作ROV
    通过android传感器控制ROV云台转动
    C#实现的简易多人聊天室
    ARM Cortex M3指令集
    ODbgscript 1.82.x Document
  • 原文地址:https://www.cnblogs.com/springsnow/p/12307128.html
Copyright © 2011-2022 走看看