Xpath----课程笔记

function getxmlDOM(str) {
    var xmlDOM = '';

    // W3C中标准DOMParser创建
    if (typeof window.DOMParser != 'undefined') {
        xmlDOM = (new DOMParser()).parseFromString(str, 'text/xml');
        // 出错会产生新的页面
        var errors = xmlDOM.getElementsByTagName('parsererror');
        // console.log(errors);
        if (errors.length > 0) {
            throw new Error('XML解析错误:' +
                errors[0].firstChild.nodeValue);
        }

    } else if (typeof window.ActiveXObject != 'undefined') {
        var version = [
            'MSXML2.DOMDocument6.0',
            'MSXML2.DOMDocument3.0',
            'MSXML2.DOMDocument',
        ];
        for (var i = 0, len = version.length; i < len; i++) {
            try {
                xmlDOM = new ActiveXObject(version[i]);
                xmlDOM.loadXML(str);
            } catch (e) {}
        }

        // 发生错误的时候xmlDOM.parseError的长度不会等于0
        if (xmlDOM.parseError != 0) {
            throw new Error('xml解析错误:' + xmlDOM.parseError.reason);
        }
    }
    return xmlDOM;
}

/**
 * 序列化代码
 * serializexmlDOM
 */
function serializexmlDOM(xmlDOM) {
    var xml = '';
    if (typeof window.XMLSerializer != 'undefined') {
        xml = (new XMLSerializer()).serializeToString(xmlDOM);
    } else if (typeof xmlDOM.xml != 'undefined') {
        xml = xmlDOM.xml;
    }
    return xml;
}





var xmlStr = '<root><name>邓志强</name><age>100</age><name>邓志强2</name><age>1002</age><email>' + Math.random() + '</email></root>';
var xmlDOM = getxmlDOM(xmlStr);

/**
 * IE
 * 1.selectSingleNode选取单一的节点
 * 2.selectNodes选取节点集合
 */

var node = xmlDOM.selectSingleNode('root/name');
// IE8和以下浏览器支持
//PS:selectSingleNode是获取单一节点,如果有多个,那么就会返回查找到的第一个。
//xmlDOM就是上下文节点,它的指针指向的是root之前
alert(node.tagName + ' ' + node.firstChild.nodeValue + ' ' + node.nodeType);

//var node = xmlDOM.documentElement;
//xmlDOM.documentElement就是root元素,这个时候指针就在root之后,name之前
//name[1表示的是第二个]但是其他浏览器表示第一个
//text()直接获取下面的内容
var node2 = xmlDOM.documentElement.selectSingleNode('name[1]/text()');
// alert('序列化: ' + node2.xml + '\n 节点类型名字: ' + node2.tagName + ' ' + node2.firstChild.nodeValue + ' ' + node2.nodeType);
alert('序列化: ' + node2.xml + '\n 节点类型名字: ' + ' ' + node2.nodeValue + ' ' + node2.nodeType);

//PS:总结上下文节点,上下文节点对象必须和XPath路径配合好,方能成功。
//但一般来说,直接用根节点即可,xmlDOM,防止混淆
//XPath规定默认从1开始,但IE是从0开始的,JS数组也是从0开始的,所以,我们都从0开始最好
// //双斜杠可以获取不关心层次的第一个user
//var node = xmlDOM.selectSingleNode('//user[1]');         
//alert(node.xml);

//root//user表示在root范围内找到不关心任何层次的user
//var node = xmlDOM.selectSingleNode('root//user');         
//alert(node.xml);

//通过唯一的属性找到user节点
//var node = xmlDOM.selectSingleNode('root/user[@id=6]');               
//alert(node.xml);




//w3c xpath方法
//使用上下文节点对象(xmlDOM)创建XPathResult
//第二种简单方便一点,但evaluate方法有五个属性:
// 1.XPath路径、
// 2.上下文节点对象、
// 3.命名空间求解器(通常是null)、
// 4.返回结果类型、
// 5.保存结果的XPathResult对象(通常是null)。
// 6.获取单一节点XPathResult.FIRST_ORDERED_NODE_TYPE
// 7.获取节点集合XPathResult.ORDERED_NODE_ITERATOR_TYPE


//两种方式创建XPathResult


//单一节点,W3C的XPath下标是从1开始的
var eva = new XPathEvaluator();
var result = eva.evaluate('root/user', xmlDOM, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
if (result !== null) {
    // 判断
    alert(serializerXML(result.singleNodeValue));
}



//单一节点
var result = xmlDOM.evaluate('root/name', xmlDOM, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
if (result !== null) {
    alert(serializerXML(result.singleNodeValue));
}

var result = xmlDOM.evaluate('root/name', xmlDOM, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
if (result != null) {
    var nodes = [];
    var node = result.iterateNext();
    while (node !== null) {
        nodes.push(node);
        node = result.iterateNext();
    }
}


//跨浏览器单一节点
function selectSingleNode(xmlDOM, xpath) {
    var node = null;
    if (typeof xmlDOM.evaluate != 'undefined') { //W3C
        var patten = /\[(\d+)\]/;
        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') { //IE
        node = xmlDOM.selectSingleNode(xpath);
    }

    return node;
}

//跨浏览器节点集合
function selectNodes(xmlDOM, xpath) {
    var nodes = [];
    if (typeof xmlDOM.evaluate != 'undefined') { //W3C
        var patten = /\[(\d+)\]/;
        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.ORDERED_NODE_ITERATOR_TYPE, null);
        if (result != null) {
            var node = null;
            while ((node = result.iterateNext()) !== null) {
                nodes.push(node);
            }
        }
    } else if (typeof xmlDOM.selectNodes != 'undefined') { //IE
        nodes = xmlDOM.selectNodes(xpath);
    }

    return nodes;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值