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;
}
Xpath----课程笔记
最新推荐文章于 2025-04-10 11:58:43 发布