JavaScript处理XML DOM、XPath和XSLT方法详解

 更新时间:2022年05月31日 09:49:37   作者:springsnow  
这篇文章介绍了JavaScript处理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: <a href="http://www.wrox.com/" 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.");
    }
}
//调用
var result = selectNodes(xmldom.documentElement, "wrox:book/wrox:author", {wrox: <a href="http://www.wrox.com/" rel="external nofollow"  rel="external nofollow"   target="_blank">http://www.wrox.com/</a>});
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.");
    }
}

到此这篇关于JavaScript处理XML DOM、XPath和XSLT的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • JavaScript 算法实现复写0双指针解法

    JavaScript 算法实现复写0双指针解法

    这篇文章主要为大家介绍了JavaScript 算法 复写0双指针解法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • JS获取填报扩展单元格控件的值的解决办法

    JS获取填报扩展单元格控件的值的解决办法

    这篇文章主要介绍了JS获取填报扩展单元格控件的值的解决办法,需要的朋友可以参考下
    2017-07-07
  • javascript 汉字转拼音实现代码

    javascript 汉字转拼音实现代码

    主要是提前定义了很多文字,这样的方法不是很是,如果库中没有这个词,是看不到相关信息的。
    2009-12-12
  • js 解析 JSON 数据简单示例

    js 解析 JSON 数据简单示例

    这篇文章主要介绍了js 解析 JSON 数据的方法,结合简单实例形式分析了js 解析 JSON 格式数据的相关操作技巧与注意事项,需要的朋友可以参考下
    2020-04-04
  • Javascript变量函数声明提升深刻理解

    Javascript变量函数声明提升深刻理解

    本文主要介绍了Javascript变量函数声明提升深刻理解,Javascript变量函数声明提升Hoisting是在Javascript中执行上下文工作方式的一种认识,更多相关知识需要的小伙伴可以参考下面文章详细内容
    2022-06-06
  • Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件

    Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件

    这篇文章主要介绍了Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • weex slider实现滑动底部导航功能

    weex slider实现滑动底部导航功能

    这篇文章主要为大家详细介绍了weex slider实现滑动底部导航功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • javascript中的set的常用方法和操作

    javascript中的set的常用方法和操作

    这篇文章主要介绍了javascript中的set的常用方法和操作,在JavaScript中Set是一种特殊的数据结构,用于存储唯一的值,创建Set对象可以通过new Set()实现,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-11-11
  • JavaScript面向对象程序设计中对象的定义和继承详解

    JavaScript面向对象程序设计中对象的定义和继承详解

    这篇文章主要介绍了JavaScript面向对象程序设计中对象的定义和继承,结合实例形式详细分析了javascript面向对象程序设计中对象定义、继承、属性、方法、深拷贝等相关概念与操作技巧,需要的朋友可以参考下
    2019-07-07
  • 微信小程序实现客服功能(客服消息)的全过程

    微信小程序实现客服功能(客服消息)的全过程

    在最近做的微信小程序中需要实现一个自带的客服功能,下面这篇文章主要给大家介绍了关于微信小程序实现客服功能(客服消息)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12

最新评论