js解析xml浏览器兼容性处理

  1 /******************************************************************************
  2     说明:xml解析类
  3 ******************************************************************************/
  4 
  5 
  6 function XMLDOCDocument() {
  7     this.xmlDoc = null;
  8     this.async = false;
  9     this.xml = null;
 10 };
 11 
 12 
 13 function createDocument() {
 14     if (typeof arguments.callee.activeXString != "string") {
 15         var versions = ["MSXML2.DOMDocument.6.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument"],
 16         i, len;
 17         for (i = 0, len = versions.length; i < len; i++) {
 18             try {
 19                 new ActiveXObject(versions[i]);
 20                 arguments.callee.activeXString = versions[i];
 21                 ActiveXObject(arguments.callee.activeXString);
 22                 break;
 23             } catch (ex) {
 24                 //跳过
 25             }
 26         }
 27     }
 28     return new ActiveXObject(arguments.callee.activeXString);
 29 };
 30 /*
 31 描述:加载xml
 32 */
 33 XMLDOCDocument.prototype.loadXML = function (xmlInfo) {
 34     //判断浏览器的类型
 35     //支持IE浏览器
 36 
 37     var isLoad = false;
 38     var xmlDomVersions = ['MSXML.2.DOMDocument.6.0', 'MSXML.2.DOMDocument.3.0', 'Microsoft.XMLDOM'];
 39     for (var i = 0; i < xmlDomVersions.length; i++) {
 40         try {
 41             this.xmlDoc = new ActiveXObject(xmlDomVersions[i]);
 42             this.xmlDoc.async = this.async;
 43             this.xmlDoc.loadXML(xmlInfo); //loadXML方法载入xml字符串
 44             this.xml = this.xmlDoc.documentElement.outerHTML;
 45             isLoad = true;
 46             break;
 47         } catch (e) {
 48         }
 49     }
 50     if (!isLoad) {
 51         if (typeof DOMParser != "undefined") {
 52             this.xmlDoc = (new DOMParser()).parseFromString(xmlInfo, "text/xml");
 53             this.xml = this.xmlDoc.documentElement.outerHTML;
 54             var errors = this.xmlDoc.getElementsByTagName("parsererror");
 55             if (errors.length) {
 56                 throw new Error("XML parsing error:" + errors[0].textContent);
 57             }
 58         } else {
 59             throw new Error("No XML parser available.");
 60         }
 61     }
 62 };
 63 
 64 /*
 65 说明:选择所有符合条件的节点
 66 */
 67 XMLDOCDocument.prototype.selectNodes = function (xPath) {
 68     return this.xmlDoc.selectNodes(xPath);
 69 };
 70 /*
 71 说明:选择一个符合条件的节点
 72 */
 73 XMLDOCDocument.prototype.selectSingleNode = function (xPath) {
 74     return this.xmlDoc.selectSingleNode(xPath);
 75 };
 76 
 77 
 78 /*
 79 说明:创建新节点
 80 */
 81 XMLDOCDocument.prototype.createElement = function (nodeName) {
 82     return this.xmlDoc.createElement(nodeName);
 83 };
 84 
 85 /*
 86 说明:创建新属性
 87 */
 88 XMLDOCDocument.prototype.createAttribute = function (attrName) {
 89     return this.xmlDoc.createAttribute(attrName);
 90 };
 91 /*
 92 说明:获得xml字符串
 93 */
 94 XMLDOCDocument.prototype.getXml = function () {
 95     //return this.xmlDoc.xml;
 96     if (typeof this.xmlDoc.xml != "undefined") {
 97 
 98         return this.xmlDoc.xml;
 99     }
100     else if (typeof XMLSerializer != "undefined") {
101         return (new XMLSerializer()).serializeToString(this.xmlDoc);
102     } else {
103         throw new Error("Could not serialize XML DOM.");
104     }
105 };
106 /*
107 说明:获得xml字符串
108 */
109 XMLDOCDocument.prototype.toString = function () {
110     //return this.xmlDoc.xml;
111     if (typeof this.xmlDoc.xml != "undefined") {
112 
113         return this.xmlDoc.xml;
114     }
115     else if (typeof XMLSerializer != "undefined") {
116         return (new XMLSerializer()).serializeToString(this.xmlDoc);
117     } else {
118         throw new Error("Could not serialize XML DOM.");
119     }
120 };
121 
122 
123 
124 
125 // check for XPath implementation 
126 if (document.implementation.hasFeature("XPath", "3.0")) {
127     // prototying the XMLDocument 
128     XMLDocument.prototype.selectNodes = function (cXPathString, xNode) {
129         if (!xNode) {
130             xNode = this;
131         }
132         var oNSResolver = this.createNSResolver(this.documentElement)
133         var aItems = this.evaluate(cXPathString, xNode, oNSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
134         var aResult = [];
135         for (var i = 0; i < aItems.snapshotLength; i++) {
136             aResult[i] = aItems.snapshotItem(i);
137         }
138         return aResult;
139     };
140 
141     // prototying the Element 
142     Element.prototype.selectNodes = function (cXPathString) {
143         if (this.ownerDocument.selectNodes) {
144             return this.ownerDocument.selectNodes(cXPathString, this);
145         }
146         else {
147             throw "For XML Elements Only";
148         }
149     };
150 
151     // prototying the XMLDocument 
152     XMLDocument.prototype.selectSingleNode = function (cXPathString, xNode) {
153         if (!xNode) { xNode = this; }
154         var xItems = this.selectNodes(cXPathString, xNode);
155         if (xItems.length > 0) {
156             return xItems[0];
157         }
158         else {
159             return null;
160         }
161     };
162 
163     // prototying the Element 
164     Element.prototype.selectSingleNode = function (cXPathString) {
165         if (this.ownerDocument.selectSingleNode) {
166             return this.ownerDocument.selectSingleNode(cXPathString, this);
167         }
168         else { throw "For XML Elements Only"; }
169     }
170 
171     Element.prototype.__defineGetter__("innerText",
172         function () {
173             return this.textContent;
174         }
175     );
176 
177     Element.prototype.__defineSetter__("innerText",
178         function (sText) {
179             this.textContent = sText;
180         }
181     );
182 
183 };

 

posted @ 2016-01-19 16:49  BG  阅读(698)  评论(0编辑  收藏  举报