注册 登录

清河洛

XML中用XPath方式查找节点的兼容

qingheluo2016-12-16清河洛246
如果要做W3C和IE的跨浏览器兼容,我们要思考几个问题:1.如果传递一个节点的下标,IE是从0开始计算,W3C从1开始计算,可以通过传递获取下标进行增1减1的操作来进行。 2.独有的功能放弃,为了保证跨浏览器。 3.只获取单一节点和节点列表即可,基本可以完成所有的操作。 跨浏览器获取单一节点function selectSingleNode(xmlDom, xpath) { var node = null; if (typeof xmlDom.evaluate != 'undefined') { var patten = /\[(\d+...

如果要做W3C和IE的跨浏览器兼容,我们要思考几个问题:

1.如果传递一个节点的下标,IE是从0开始计算,W3C从1开始计算,可以通过传递获取下标进行增1减1的操作来进行。
2.独有的功能放弃,为了保证跨浏览器。
3.只获取单一节点和节点列表即可,基本可以完成所有的操作。

跨浏览器获取单一节点

function selectSingleNode(xmlDom, xpath) {
    var node = null;
    if (typeof xmlDom.evaluate != 'undefined') {
        var patten = /\[(\d+)\]/g;
        var flag = xpath.match(patten);
        var num = 0;
        if (flag !== null) {
            num = parseInt(RegExp.$1) + 1;
            xpath = xpath.replace(patten, '[' + num + ']');
        }
        var result = xmlDom.evaluate(xpath, xmlDom, null,
        XPathResult.FIRST_ORDERED_NODE_TYPE, null);
        if (result !== null) {
            node = result.singleNodeValue;
        }
    } else if (typeof xmlDom.selectSingleNode != 'undefined') {
        node = xmlDom.selectSingleNode(xpath);
    }
    return node;
}

跨浏览器获取节点集合

function selectNodes(xmlDom, xpath) {
    var nodes = [];
    if (typeof xmlDom.evaluate != 'undefined') {
        var patten = /\[(\d+)\]/g;
        var flag = xpath.match(patten);
        var num = 0;
        if (flag !== null) {
            num = parseInt(RegExp.$1) + 1;
            xpath = xpath.replace(patten, '[' + num + ']');
        }
        var node = null;
        var result = xmlDom.evaluate('root/user', xmlDom, null,
        XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
        if (result !== null) {
            while ((node = result.iterateNext()) !== null) {
                nodes.push(node);
            }
        }
    } else if (typeof xmlDom.selectNodes != 'undefined') {
        nodes = xmlDom.selectNodes(xpath);
    }
    return nodes;
}

在传递xpath路径时,没有做验证判断是否合法,可以另行编写



网址导航