logo 西林@生存 - 骑猪闯天下!
xpath 数组的起始下标
2008-3-30 23:36:00 By:xling

MSXML 4.0 SDK 中,XPath的示例中,有如下说法:

author[1]
The first <author> element in the current context node.
author[first-name][3]
The third <author> element that has a <first-name> child.

1是first ,3 是third,意思是说下标应该是从1开始的.

在 O'Reilly JavaScript: The Definitive Guide, 5th Edition 的这一章:21.4. Querying XML with XPath 也有这么一段话:

Note that XPath array syntax uses 1-based arrays instead of JavaScript-style 0-based arrays.

但是本人在IE7下测试,这个起始下标却是从0开始的。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script language="javascript" type="text/javascript" src="http://blogbeta.blueidea.com/Ajax.js"></script>
</head>

<body>
<script language="javascript" type="text/javascript">
//evaluate
Ajax.$send({
 url:"test.xml",
 method:"GET",
 async:true,
 
 onSuccess:function(xmlHttp,status,rule,dataRule){
  if(Browser.ie){
   var nodes = xmlHttp.responseXML.selectNodes("student[2]");
   //alert(nodes.length)
   alert(nodes[0].xml);
   //alert(nodes[0].childNodes[0].nodeValue);
  }else{
   var nodes = xmlHttp.responseXML.evaluate("/root/student[2]", xmlHttp.responseXML, null, XPathResult.ANY_TYPE, null);
   var node;
   while(node = nodes.iterateNext()){
    alert(node.xml);
   }
  }
 },
 
 onUnsuccess:function(xmlHttp,status,rule,dataRule){

 }   
});

/*var dom = Ajax.$parseXML("<node>aaa</node>");
alert(dom.documentElement.xml || dom.documentElement.textContent);
dom = Ajax.$loadXML("<l>a</l>")
alert(dom.documentElement);*/
</script>
</body>
</html>

Ajax.js

Browser = {};
(function($){
 
 
 var $fv = function(){
  var f="-1",n=navigator;
  if (n.plugins && n.plugins.length) {
   for (var ii=0;ii<n.plugins.length;ii++) {
    if (n.plugins[ii].name.indexOf('Shockwave Flash')!=-1) {
     f=n.plugins[ii].description.split('Shockwave Flash ')[1];
     break;
    }
   }
  } else if (window.ActiveXObject) {
   for (var ii=10;ii>=2;ii--) {
    try {
     var fl=eval("new ActiveXObject('ShockwaveFlash.ShockwaveFlash."+ii+"');");
     if (fl) { f=ii + '.0'; break; }
    }catch(e) {}
   }
  }
 
  if(f == "-1") return f;
  else return f.substring(0,f.indexOf(".")+2)   
 }  
 
 var n_ = navigator,s_ = screen;
 
 var b = n_.appName;
 var ua = n_.userAgent.toLowerCase();
 
 $.name = "Unknow";
 $.safari = ua.indexOf("safari")>-1;  // always check for safari & opera
 $.opera = ua.indexOf("opera")>-1;    // before ns or ie
 $.firefox = ua.indexOf('firefox')>-1; // check for gecko engine 
 $.netscape = !$.firefox && !$.opera && !$.safari && (b=="Netscape");
 $.ie = !$.opera && (b=="Microsoft Internet Explorer");
 
 $.name = ($.ie ? "IE" : ($.firefox ? "Firefox" : ($.netscape? "Netscape" : ($.opera ? "Opera" : ($.safari ? "Safari" : "Unknow")))));
 
 switch($.name){
  case "Opera":
   $.fullVersion = ua.substr(ua.indexOf("opera") + 6);
   break;
  case "IE":
   $.fullVersion = ua.substr(ua.indexOf("msie") + 5).split(";")[0];
   break;
  case "Firefox":
   $.fullVersion = ua.substr(ua.indexOf("firefox") + 8);
   break;
  case "Safari":
   $.fullVersion = ua.substr(ua.indexOf("version") + 8).split(" ")[0];
   break;
  case "Netscape":
   $.fullVersion = ua.substr(ua.indexOf("netscape") + 9);
   break;
  default:
   $.fullVersion = "-1";
 }
 $.version = parseFloat($.fullVersion);
 
 $.flashVersion = $fv();
 $.cookieEnabled = n_.cookieEnabled;
 $.javaEnabled = n_.javaEnabled();
})(Browser);

/*------------------------------------------------------------------------------
Ajax Operate;
------------------------------------------------------------------------------*/

if(!Browser.ie){
 Element.prototype.__defineGetter__("xml",function(){
            return (new XMLSerializer).serializeToString(this);
           }); 
}

Ajax = {};
(function($){
 
 var ACTIVEXOBJECT_XMLHTTP = null;
 
 var isFunction = function(p){
  return p instanceof Function;
 }
 
 var AjaxObj = function(rule,dataRule){
  var self = this;
  
  var ready = function(){
   self.url  = rule.url;
   self.method  = rule.method || "GET";
   self.async  = rule.async || false;
   self.data  = rule.data || null;
   self.onSuccess = rule.onSuccess;
   self.onUnsuccess= rule.onUnsuccess;
   self.onReady = rule.onReady;   
  } 
  
  this.xmlHttp = $.$getXMLHttp();
  this.xmlHttp.onreadystatechange = function(){
   
   var http = self.xmlHttp;
   
   if(http.readyState == 4){
    switch(http.status){
     case 200:
      isFunction(self.onSuccess) ? self.onSuccess(http,200,rule,dataRule) : null;
      break;
     default :
      isFunction(self.onUnsuccess) ? self.onUnsuccess(http,http.status,rule,dataRule) : null;
    }
   }else
    isFunction(self.onWait) ? self.onWait(http,http.readyState,rule,dataRule) : null;     
  }
  
  this.$send = function(){
   ready();
   self.xmlHttp.open(self.method,self.url,self.async);
   self.xmlHttp.send(self.data);
  }
 }
 
 $.$getXMLHttp = function(){
  var xmlHttp = null;
  if(Browser.ie && Browser.version < 7){
   var v = ['MSXML2.XMLHTTP.8.0', 'MSXML2.XMLHTTP.7.0', 'MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP.2.6', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
   if(typeof(ACTIVEXOBJECT_XMLHTTP) == "string")
    v[0] = ACTIVEXOBJECT_XMLHTTP;
   
   var v_;
   for(var i=0;v_ = v[i];i++){
    try{
     xmlHttp = new ActiveXObject(v_);
     ACTIVEXOBJECT_XMLHTTP = v_;
     break;
    }catch(e){}
   }
  }else{
   xmlHttp = new XMLHttpRequest();
  }
  
  if(xmlHttp == null){
   alert("你的系统不支持AJAX");
  }
  return xmlHttp;
 }
 
 
 $.$getXMLDoc = function(){
  //DOMParser
  //document.implementation
  if(Browser.ie){
   var doc = null;
   var v = ["Msxml2.DOMDocument.6.0","Msxml2.DOMDocument.5.0","Msxml2.DOMDocument.4.0","Msxml2.DOMDocument.3.0","MSXML2.DOMDocument"];
   if(typeof(ACTIVEXOBJECT_DOMDOCUMENT) == "string")
    v[0] = ACTIVEXOBJECT_DOMDOCUMENT;
   
   var v_;
   for(var i=0;v_ = v[i];i++){
    try{
     doc = new ActiveXObject(v_);
     ACTIVEXOBJECT_DOMDOCUMENT = v_;
     break;
    }catch(e){}
   }
  }else if(document.implementation && document.implementation.createDocument){
   doc = document.implementation.createDocument("","doc",null)
  }
  
  return doc;
 }
 
 $.$loadXML = $.$parseXML = function(source){
  var doc;
  if(window.DOMParser){
   var parser = new DOMParser();
   doc = parser.parseFromString(source,"text/xml");
  }else{
   doc = $.$getXMLDoc();
   doc.loadXML(source);
  }
  return doc;
 }
 
 $.$getNodeAtt = function(pNode,pAtt){
  try{
   return pNode.attributes.getNamedItem(pAtt).nodeValue;
  }catch(e){
   //alert("前台调试错误:\n"+e.message+"\n当前节点不存在: "+pAtt+"这个属性");
  }
 }
 
 
 $.$extractNodes = function(pNode){
  if(pNode.nodeType == 3)
   return null;
  var node,nodes = new Array();
  for(var i=0;node= pNode.childNodes[i];i++){
   if(node.nodeType == 1 || node.nodeType == 4)
    nodes.push(node);
  }
  return nodes;
 }
 
 $.$getXML = $.$serialize = function(pNode){
  if(!pNode) return null;
  if(pNode.xml)
   return pNode.xml;
  else if(window.XMLSerializer)
   return (new XMLSerializer()).serializeToString(pNode);
 }
 
 $.$send = function(rule,dataRule){
  var ajax = new AjaxObj(rule,dataRule);
  ajax.$send();
 }
})(Ajax);

test.xml

<?xml version="1.0" encoding="utf-8"?>
<root>
 <student id="1">
  <name>xling</name>
  <sex>m</sex>
 </student>
 <student id="2">
  <name>snow</name>
  <sex>f</sex>
 </student>
</root>

转我的贴,写你的名,是一种可耻的行为!请不要让我BS你!
阅读全文 | 回复(0) | 引用通告 | 编辑

发表评论:

    密码:
    主页:
    标题:
    页面数据正在载入...
<<  < 2008 - >  >>
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Placard
请职:PHP或JS都行,如果学历要求本科的,请直接忽略。谢谢。 有意者请联系:1fairy1#163.com
Logon System
Search
Info about this blog
Others
myDream
JGrid

数据表格
JTree

树状控件
JMenuTab

标签控件(滑动门)
JTrackBar / JScroll

滑动条/模拟滚动条
JAccordion

(QQ菜单)
关于:
xling,也叫xlingFairy 艾克司令 西林.
Email:1fairy1#163.com
喜欢javascript,喜欢java(汗...还在学习中...水平菜的要死...)
bxna 京ICP备05002321号