Javascript 支持在 Firefox 下读取 XML 节点的方法

最近在修改项目的用到Ajax 功能的页面,发现很多写法在Firefox下都存在问题,主要是因为当时开发时只在 IE 下测试通过就提交了,而 Firefox 的写法与 IE 有很大的区别,主大的问题是当在读取XML 节点或子节点的内容时,IE 下一般使用selectNodes selectSingleNode 这些方法,而 Firefox 并没有这些方法,所以不能使用,前几天找了好久终于,一直没有找到一个很好的解决方法,很多网站提供的要不就是根本不支持,要不就是使用方法,不方便不实用,今天我终于找到一个很好的解决方法了,我把它弄成一个 JS 文件,只要引用它就可以像 IE 一样使用了。

代码如下:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
var GetNodeValue = function(obj)
{
  var str = ””;
    if(window.ActiveXObject)    //IE
    {
      str = obj.text;
    }
    else //Mozilla
    {
      try
      {
        str = obj.childNodes[0].nodeValue;
      }
      catch(ex)
      {
        str = ””;
      }
    }
    return str;
  }

  if(document.implementation && document.implementation.createDocument)
  {
    XMLDocument.prototype.loadXML = function(xmlString)
    {
      var childNodes = this.childNodes;
      for (var i = childNodes.length - 1; i >= 0; i)
        this.removeChild(childNodes[i]);

      var dp = new DOMParser();
      var newDOM = dp.parseFromString(xmlString, text/xml);
      var newElt = this.importNode(newDOM.documentElement, true);
      this.appendChild(newElt);
    };

    // check for XPath implementation
    if( document.implementation.hasFeature(XPath, 3.0) )
    {
       // prototying the XMLDocument
       XMLDocument.prototype.selectNodes = function(cXPathString, xNode)
       {
        if( !xNode ) { xNode = this; }
        var oNSResolver = this.createNSResolver(this.documentElement)
        var aItems = this.evaluate(cXPathString, xNode, oNSResolver,
         XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
        var aResult = [];
        for( var i = 0; i < aItems.snapshotLength; i++)
        {
         aResult[i] =  aItems.snapshotItem(i);
       }
       return aResult;
     }

       // prototying the Element
       Element.prototype.selectNodes = function(cXPathString)
       {
        if(this.ownerDocument.selectNodes)
        {
         return this.ownerDocument.selectNodes(cXPathString, this);
       }
       else{throw For XML Elements Only;}
     }
   }

    // check for XPath implementation
    if( document.implementation.hasFeature(XPath, 3.0) )
    {
       // prototying the XMLDocument
       XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode)
       {
        if( !xNode ) { xNode = this; }
        var xItems = this.selectNodes(cXPathString, xNode);
        if( xItems.length > 0 )
        {
         return xItems[0];
       }
       else
       {
         return null;
       }
     }

       // prototying the Element
       Element.prototype.selectSingleNode = function(cXPathString)
       {
        if(this.ownerDocument.selectSingleNode)
        {
         return this.ownerDocument.selectSingleNode(cXPathString, this);
       }
       else{throw For XML Elements Only;}
     }
   }
}


只要把以上代码存成一个 JS 文件,在页面上引用它,当 XML 节点的读取操作就可以像 IE 一样使用了,已经通过测试。