今天写了这样一段代码: 
  
  
    
    
      <
    
    
      script language
    
    
      =
    
    
      "
    
    
      javascript
    
    
      "
    
    
      >
    
    
      
      
         
    
    
      function
    
    
       testXml()
      
      
      
         
    
    
      
    
    
      
        {
        
        
              
      
      
        var
      
      
         objXml 
      
      
        =
      
      
         
      
      
        new
      
      
         ActiveXObject('MSXML2.DOMDocument');
        
        
              
      
      
        var
      
      
         strXml 
      
      
        =
      
      
        "
      
      
        <xml><aa>abcd</aa></xml>
      
      
        "
      
      
        ;
        
        
              objXml.setProperty(
      
      
        "
      
      
        SelectionLanguage
      
      
        "
      
      
        ,
      
      
        "
      
      
        XPath
      
      
        "
      
      
        );
        
        
             
        
        
              objXml.loadXML(strXml);
        
        
              
      
      
        var
      
      
         objaa 
      
      
        =
      
      
         objXml.selectSingleNode(
      
      
        "
      
      
        xml/aa[0]
      
      
        "
      
      
        );
        
        
              alert(objaa.text);
        
        
           }
      
    
    
      
      
         testXml();
      
      
    
    
      </
    
    
      script
    
    
      >
    
  
     系统抛出异常,未找到对象。也就是objXml.selectSingleNode("xml/aa[0]");返回的是null。"xml/aa[0]"是如此简单的表达式,错误只有可能出在"[0]"上。查阅了一些资料后,将objXml.selectSingleNode("xml/aa[0]");修改成objXml.selectSingleNode("xml/aa[1]"),运行通过成功找到了节点。原来Xpath中节点计数是从1开始的。 
  
也许事情不是这样简单,我曾经隐约记得写过objXml.selectSingleNode("xml/aa[0]")这样的代码,并且也能正确的找到节点。我将代码进行了以下修改:
  
    
    
      <
    
    
      script language
    
    
      =
    
    
      "
    
    
      javascript
    
    
      "
    
    
      >
    
    
      
      
         
    
    
      function
    
    
       testXml()
      
      
      
         
    
    
      
    
    
      
        {
        
        
              
      
      
        var
      
      
         objXml 
      
      
        =
      
      
         
      
      
        new
      
      
         ActiveXObject('MSXML2.DOMDocument');
        
        
              
      
      
        var
      
      
         strXml 
      
      
        =
      
      
        "
      
      
        <xml><aa>abcd</aa></xml>
      
      
        "
      
      
        ;
        
        
              
      
      
        //
      
      
        objXml.setProperty("SelectionLanguage","XPath");不再采用Xpath方式
      
      
        
        
      
      
             
        
        
              objXml.loadXML(strXml);
        
        
              
      
      
        var
      
      
         objaa 
      
      
        =
      
      
         objXml.selectSingleNode(
      
      
        "
      
      
        xml/aa[1]
      
      
        "
      
      
        );
        
        
              alert(objaa.text);
        
        
           }
      
    
    
      
      
         testXml();
      
      
    
    
      </
    
    
      script
    
    
      >
    
  
       系统抛出异常,提示未找到对象。难道非Xpath方式选取节点,节点计数是从0开始的?我将objXml.selectSingleNode("xml/aa[1]")修改成objXml.selectSingleNode("xml/aa[0]"),代码成功运行,并且找到节点。 
  
由此我们不难看出,非Xpath方式选取节点时,第一个节点用[0]来标示;而用Xpath方式选取节点时,第一个节点用[1]来标示。注意,只有在MSXML2.DOMDocument 4.0以下版本才默认采用非Xpath方式选取节点,即类似正则表达式的方式选取。
为什么会造成这种情况呢?也许是当年微软设计该组件的时候Xpath标准还没有正式出台,也或者是Xpath标准没有兼顾微软以前的设计,出现了最不应该出现的不兼容性。
  
 
    
      <
    
    
      script language
    
    
      =
    
    
      "
    
    
      javascript
    
    
      "
    
    
      >
    
    
      
         
    
    
      function
    
    
       testXml()
      
      
         
    
    
      
              
      
      
        var
      
      
         objXml 
      
      
        =
      
      
         
      
      
        new
      
      
         ActiveXObject('MSXML2.DOMDocument');
        
              
      
      
        var
      
      
         strXml 
      
      
        =
      
      
        "
      
      
        <xml><aa>abcd</aa></xml>
      
      
        "
      
      
        ;
        
              objXml.setProperty(
      
      
        "
      
      
        SelectionLanguage
      
      
        "
      
      
        ,
      
      
        "
      
      
        XPath
      
      
        "
      
      
        );
        
             
        
              objXml.loadXML(strXml);
        
              
      
      
        var
      
      
         objaa 
      
      
        =
      
      
         objXml.selectSingleNode(
      
      
        "
      
      
        xml/aa[0]
      
      
        "
      
      
        );
        
              alert(objaa.text);
        
           }
      
    
    
      
         testXml();
      
    
    
      </
    
    
      script
    
    
      >
    
  也许事情不是这样简单,我曾经隐约记得写过objXml.selectSingleNode("xml/aa[0]")这样的代码,并且也能正确的找到节点。我将代码进行了以下修改:
    
      <
    
    
      script language
    
    
      =
    
    
      "
    
    
      javascript
    
    
      "
    
    
      >
    
    
      
         
    
    
      function
    
    
       testXml()
      
      
         
    
    
      
              
      
      
        var
      
      
         objXml 
      
      
        =
      
      
         
      
      
        new
      
      
         ActiveXObject('MSXML2.DOMDocument');
        
              
      
      
        var
      
      
         strXml 
      
      
        =
      
      
        "
      
      
        <xml><aa>abcd</aa></xml>
      
      
        "
      
      
        ;
        
              
      
      
        //
      
      
        objXml.setProperty("SelectionLanguage","XPath");不再采用Xpath方式
      
      
        
      
      
             
        
              objXml.loadXML(strXml);
        
              
      
      
        var
      
      
         objaa 
      
      
        =
      
      
         objXml.selectSingleNode(
      
      
        "
      
      
        xml/aa[1]
      
      
        "
      
      
        );
        
              alert(objaa.text);
        
           }
      
    
    
      
         testXml();
      
    
    
      </
    
    
      script
    
    
      >
    
  由此我们不难看出,非Xpath方式选取节点时,第一个节点用[0]来标示;而用Xpath方式选取节点时,第一个节点用[1]来标示。注意,只有在MSXML2.DOMDocument 4.0以下版本才默认采用非Xpath方式选取节点,即类似正则表达式的方式选取。
为什么会造成这种情况呢?也许是当年微软设计该组件的时候Xpath标准还没有正式出台,也或者是Xpath标准没有兼顾微软以前的设计,出现了最不应该出现的不兼容性。

