现在的位置: 首页 > 综合 > 正文

javascript中的xpath

2013年12月07日 ⁄ 综合 ⁄ 共 2600字 ⁄ 字号 评论关闭

1.xpatch的出现时因为以前的传统dom查找挺费劲

2.xpatchIE和其他的浏览器是严重不兼容的,所以要分开来说!

 

首先你要创建一个XMLDOM,然后才能继续

 

//跨浏览器返回XML DOM对象
function getXMLDOM(xmlStr) {
 var xmlDom = null;
 
 if (typeof window.DOMParser != 'undefined') {
  xmlDom = (new DOMParser).parseFromString(xmlStr, 'text/xml');
  var errors = xmlDom.getElementsByTagName('parsererror');
  if (errors.length > 0) {
   throw new Error('错误信息:' + errors[0].textContent);
  }
 } else if (typeof window.ActiveXObject != 'undefined') {
  var version = [
         'MSXML2.DOMDocument6.0',
         'MSXML2.DOMDocument3.0',
         'MSXML2.DOMDocument'
  ];
  
  for (var i = 0; i < version.length; i ++) {
   try {
    var xmlDom = new ActiveXObject(version[i]);
   } catch (e) {
    //跳过
   }
  }
  xmlDom.loadXML(xmlStr);
  if (xmlDom.parseError != 0) {
    throw new Error('错误信息:' + xmlDom.parseError.reason);
  }
  return xmlDom;
 } else {
  throw new Error('您的系统或浏览器不支持XML DOM对象!');
 }
 
 return xmlDom;
}

//序列化XML
function serializerXML(xmlDom) {
 var xml = '';
 
 if (typeof window.XMLSerializer != 'undefined') {
  xml = (new XMLSerializer()).serializeToString(xmlDom);
 } else if (typeof xmlDom.xml != 'undefined') {
  xml = xmlDom.xml;
 }
 
 return xml;
}

我们先说IE的Xpath(其实只有2个方法)

 

var xmlStr = '<root><user id="5">Lee</user><user id="6">Koko</user></root>';
var xmlDom = getXMLDOM(xmlStr);
//alert(serializerXML(xmlDom));

//IE中的两种方法:1.selectSingleNode() 获取单一节点,2.selectNodes() 获取节点集合
//XPath查找手段,就是路径查找,结构树查找

//var node = xmlDom.selectSingleNode('root/user');
//alert(node.xml);
//alert(node.tagName);
//alert(node.firstChild.nodeValue);  //这里获取值的时候还是标准DOM

//PS:selectSingleNode是获取单一节点,如果有多个,那么就会返回查找到的第一个。
//xmlDom就是上下文节点,它的指针指向的是root之前

//var node = xmlDom.documentElement;
//xmlDom.documentElement就是root元素,这个时候指针就在root之后,user之前
//var node = xmlDom.documentElement.selectSingleNode('root/user');  //错误的
//var node = xmlDom.documentElement.selectSingleNode('user');   //正确的
//alert(node.xml);
//xmlDom.documentElement这个也是上下文节点对象

//var node = xmlDom.selectSingleNode('user');   //错误了
//alert(node.xml);

//PS:总结上下文节点,上下文节点对象必须和XPath路径配合好,方能成功。但一般来说,直接用根节点即可,xmlDom,防止混淆

 //XPath规定默认从1开始,但IE是从0开始的,JS数组也是从0开始的,所以,我们都从0开始最好
//var node = xmlDom.selectSingleNode('root/user[1]');
//alert(node.xml);

//var node = xmlDom.selectSingleNode('root/user/text()');   //text()可以获取节点内的值
//alert(node.nodeValue);
//alert(node.xml);

//var node = xmlDom.selectSingleNode('//user[1]');   //双斜杠可以获取不关心层次的第一个user
//alert(node.xml);

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

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

var nodes = xmlDom.selectNodes('root[0]/user');
//alert(nodes.length);
//alert(nodes[0].xml);
//alert(nodes[1].xml);
//alert(nodes[0].xml);
alert(nodes[1].xml);

 

 

 

 

 

抱歉!评论已关闭.