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>