Ò» IEÖеÄXML DOM
1.΢Èíͨ¹ýActiveXµÄMSXML¿âÌṩÁËÖ§³Ö£¬Í¨¹ý£º
var oXmlDom = new ActiveXObject("MSXML2.DOMDocument.5.0")
µÃµ½Ò»¸öXML DOM¶ÔÏó£¬ÕâÊÇÔÚIE6Öеģ¬Èç¹ûÄãµÄIEÊǸüÀϰ汾µÄ£¬¿ÉÒÔʹÓÃÏÂÃæµÄº¯ÊýµÃµ½£¬Èç¹ûÄãûÓа²×°MSXML£¬½«²»Äܵõ½£º
function createXMLDOM() {
var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0",
"MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument",
"Microsoft.XmlDom"];
for (var i=0; i < arrSignatures.length; i++) {
try {
var oXmlDom = new ActiveXObject(arrSignatures[i]);
return oXmlDom;
} catch (oError) {
//ignore
}
}
throw new Error("ÄãµÄϵͳûÓа²×°MSXML");
}
µ±È»£¬Èç¹ûÄãʹÓÃprototype¿â£¬¿ÉÒÔʹÓÃTry.theseº¯Êý¡£
2.XML DOM¶ÔÏó¿ÉÒÔͨ¹ýloadºÍloadXML·½·¨ÔØÈëxmlÎļþ»òÕß×Ö·û´®£º
oXmlDom.load("test.xml");
oXmlDom.loadXML("<root></root>");
È»ºóÕâ¸öoXmlDom¾Í¿ÉÒÔʹÓÃËùÓеÄDOM¶ÔÏó·½·¨£¬±ÈÈçdocumentElement.tagName,²Î¼û£º
¡¶javascriptÖ®DOM¼¼Êõ£¨Ò»£©¡·
¡¶javascriptÖ®dom¼¼Êõ£¨¶þ£©¡·
3.XML DOMĬÈÏÊÇͨ¹ýÒì²½ÔØÈëxmlÎļþµÄ£¬¿ÉÒÔͨ¹ýÉèÖÃasyncÖµÀ´Ñ¡ÔñÊÇͬ²½»¹ÊÇÒì²½£º
oXmlDom.async=true;
4.IEµÄXML DOMÓµÓÐÒ»¸öreadyStateÖµÓÃÀ´±íÊ¾ÔØÈëÎļþµÄ״̬£º
0——×¼±¸ÔØÈë
1——ÕýÔÚÔØÈë
2——ÔØÈëÍê³É
3——ÔØÈëÍê³É²¢¿ÉÓ㬵«ÓÐÒ»²¿·ÖÊý¾ÝÒ²Ðí²»¿ÉÓÃ
4——ÍêÈ«ÔØÈ룬ÍêÈ«¿ÉÓá£
ÏàÓ¦µÄÓÐÒ»¸öonreadystatechangeʼþ£¬µ±×´Ì¬¸Ä±äʱ·¢Éú£¬ÎÒÃÇ¿ÉÒÔͨ¹ý¼àÌý´ËʼþÀ´ÅжÏXML DOM¶ÔÏóµÄ¿ÉÓÃÐÔ
oXmlDom.onreadystatechange = function () {
if (oXmlDom.readyState == 4) {
alert("load test.xml done!");
alert("Tag name of the root element is " + oXmlDom.documentElement.tagName);
alert("The root element has this many children: " + oXmlDom.documentElement.childNodes.length);
}
};
5.IEµÄXML DOM¶ÔÏóÓÐÒ»¸öxmlÊôÐÔ£¬ÓÃÀ´·µ»ØxmlÎļþµÄ×Ö·û´®ÐÎʽ£¬±ÈÈç
oXmlDom.async=false;
oXmlDom.load("test.xml");
alert(oXmlDom.xml);
alert³ö£º<root><child/><child/></root>
6.IE£¬µ±ÔØÈëµÄXMLÎļþ»òÕß×Ö·û´®½âÎö´íÎóʱ£¬½«²úÉúÒ»¸öparseError¶ÔÏó£¬ÎÒÃÇÔÚÏÂÃæµÄ´úÂëÖÐÑÝʾ´Ë¶ÔÏóµÄÊôÐÔ£º
oXmlDom.async = false;
oXmlDom.load("errors.xml");
//0±íʾûÓдíÎó
if (oXmlDom.parseError != 0) {
var oError = oXmlDom.parseError;
alert("An error occurred:\n´íÎó´úÂë: "
+ oError.errorCode + "\n"
+ "ÐÐÊý: " + oError.line + "\n"
+ "ÁÐÊý: " + oError.linepos + "\n"
+ "ÔÒò: " + oError.reason);
}
¶þ.MozillaµÄXML DOM¶ÔÏó
1.XML DOM¶ÔÏóµÄ´´½¨£¬·ûºÏDOM±ê×¼µÄ£¬Í¨¹ýdocument.implementation.createDocument()·½·¨¡£±ÈÈ磺
var oXmlDom=document.implementation.createDocument("","",null);
ÕâÈý¸ö²ÎÊý·Ö±ðÊÇÎĵµÃüÃû¿Õ¼ä¡¢ÎĵµÔªËصıêÇ©ÃûÒÔ¼°Ò»¸öÎĵµÀàÐͶÔÏó£¨×ÜΪnull£©£¬±ÈÈ磺
var oXmlDom=document.implementation.createDocument("http://www.rubyeye.net","root",null);
Õâ¶Î´úÂë´´½¨ÁËÒ»¸ö<a0:root xmlns="http://www.rubyeye.net"/>µÄXML DOM¶ÔÏó
2.ÔØÈëxml£¬MozillaÓëIE²»Í¬µÄÊÇÖ»ÌṩÁËÒ»¸öload()·½·¨ÓÃÓÚÔØÈëxmlÎļþ£¬Ã»ÓÐÌṩloadXML()·½·¨ÓÃÓÚÔØÈëXML×Ö·û´®¡£Í¬²½ÔØÈëXMLÎļþµÄ´úÂëÓëIEÏàͬ£º
oXmlDom.async=false;
oXmlDom.load("test.xml");
Òì²½ÔØÈëÉÔÓв»Í¬£¬ÒòΪMozilla²¢²»Ö§³ÖreadyStateÊôÐÔ£¬²¢ÇÒûÓÐonreadystatechangeʼþ£¬ËüÖ»ÓÐÒ»¸öonloadµÄʼþ£¬µ±ÔØÈëÍê³Éʱ´¥·¢£»»òÕß˵Ï൱ÓÚIEµÄreadyStateÊôÐÔµÈÓÚ4µÄ״̬¡£
oXmlDom.onload=function(){
alert("done");
}
oXmlDom.load("test.xml");
Òª½«XML×Ö·û´®½âÎöΪDOM¶ÔÏ󣬱ØÐëʹÓÃDOMParser¶ÔÏó£º
var oParser=new DOMParser();
var oXmlDom=oParser.parseFromString("<root><child/></root>,"text/xml");
Á½¸ö²ÎÊý£ºÒª½âÎöµÄXML×Ö·û´®ÒÔ¼°×Ö·û´®µÄÄÚÈÝÀàÐÍ£¨Ö»ÄÜΪtext/xml»òÕßapplication/xml£©¡£
²»¹ýÎÒÃÇ¿ÉÒÔʵÏÖ×Ô¼ºµÄloadXML·½·¨:
Document.prototype.loadXML = function (sXml) {
var oParser = new DOMParser();
var oXmlDom = oParser.parseFromString(sXml, "text/xml");
//ɾ³ýÔÎĵµÄÚÈÝ
while (this.firstChild) {
this.removeChild(this.firstChild);
}
//µ¼ÈëеÄÎĵµÄÚÈÝ
for (var i=0; i < oXmlDom.childNodes.length; i++) {
var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
this.appendChild(oNewNode);
}
};
3.MozillaûÓÐÌṩIEµÄxmlÊôÐÔÀ´·µ»ØXMLÎĵµÄÚÈÝ£¬Ö»ÄÜͨ¹ýʹÓÃXMLSerializer¶ÔÏó£º
var oSerializer=new XMLSerializer();
var sXml=oSerializer.serializeToString(oXmlDom,"text/xml");
ͬÑùÁ½¸ö²ÎÊý£ºXML DOM¶ÔÏóÒÔ¼°×ª»¯³ÉµÄÎĵµÀàÐÍ¡£
ͬÑù£¬ÎÒÃÇÒ²¿ÉÒÔ¸øMozillaµÄXML DOM¶ÔÏó¶¨ÒåÒ»¸öÊôÐÔxml£¬Í¨¹ýdefineGetter·½·¨£º
Node.prototype.__defineGetter__("xml",function(){
var oSerializer=new XMLSerializer();
var sXml=oSerializer.serializeToString(this,"text/xml");
});
ÒÔºó¾Í¿ÉÒÔÒÔIEµÄ·½Ê½£¬oXmlDom.xmlÀ´»ñÈ¡XMLÎĵµÄÚÈÝ¡£
4¡£´íÎó´¦Àí£¬Í¬ÑùÓëIE²»Í¬£¬Mozillaµ±½âÎö´íÎóʱ»á·µ»ØÒ»¶Î´úÂ룬ÒÔ±êÇ©<prasereoor>°üÀ¨ÆäÖеĴúÂë½âÊÍÁË´íÎó·¢ÉúµÄÔÒòÒÔ¼°Î»ÖõÈÐÅÏ¢£¬ÎÒÃÇÖ»ÓÐͨ¹ýÕýÔò±í´ïʽ½âÎö´Ë¶Î´úÂ룬ÌáÈ¡´íÎóÐÅÏ¢¡£
var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;
//·µ»Ø´úÂëµÄ±êÇ©ÃûΪparsererror£¬±íʾ´íÎó·¢Éú
if (oXmlDom.documentElement.tagName == "parsererror") {
reError.test(oXmlDom.xml);
alert("An error occurred:\nÃèÊö: "
+ RegExp.$1 + "\n"
+ "ÎļþÃû: " + RegExp.$2 + "\n"
+ "ÐÐÊý: " + RegExp.$3 + "\n"
+ "ÁÐÊý: " + RegExp.$4 + "\n"
+ "ÔÒò: " + RegExp.$5);
}
Èý£¬Ìṩһ¸ö¿çä¯ÀÀÆ÷µÄXML DOM¶ÔÏó½â¾ö·½°¸£¬À´×ÔÓÚ¡¶javascript¸ß¼¶³ÌÐòÉè¼Æ¡·
function XmlDom() {
//ͨ¹ý¶ÔÏó/ÊôÐÔ¼ì²â·¨£¬ÅжÏÊÇIEÀ´ÊÇMozilla
if (window.ActiveXObject) {
var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0",
"MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument",
"Microsoft.XmlDom"];
for (var i=0; i < arrSignatures.length; i++) {
try {
var oXmlDom = new ActiveXObject(arrSignatures[i]);
return oXmlDom;
} catch (oError) {
//ignore
}
}
throw new Error("MSXML is not installed on your system.");
//ͬÉÏ
} else if (document.implementation && document.implementation.createDocument) {
var oXmlDom = document.implementation.createDocument("","",null);
//´´½¨Mozilla°æ±¾µÄparseError¶ÔÏó
oXmlDom.parseError = {
valueOf: function () { return this.errorCode; },
toString: function () { return this.errorCode.toString() }
};
//³õʼ»¯parseError¶ÔÏó
oXmlDom.__initError__();
oXmlDom.addEventListener("load", function () {
this.__checkForErrors__();
this.__changeReadyState__(4);
}, false);
return oXmlDom;
} else {
throw new Error("Your browser doesn't support an XML DOM object.");
}
}
//´Ë´¦Óõ½Á˸ÃÊéÖÐÒ»¸öä¯ÀÀÆ÷ϵͳ¼ì²âjsÎļþ£¬Èç¹ûÊÇMozilla
if (isMoz) {
Document.prototype.readyState = 0;
Document.prototype.onreadystatechange = null;
Document.prototype.__changeReadyState__ = function (iReadyState) {
this.readyState = iReadyState;
if (typeof this.onreadystatechange == "function") {
this.onreadystatechange();
}
};
//³õʼ»¯parseError¶ÔÏó
Document.prototype.__initError__ = function () {
this.parseError.errorCode = 0;
this.parseError.filepos = -1;
this.parseError.line = -1;
this.parseError.linepos = -1;
this.parseError.reason = null;
this.parseError.srcText = null;
this.parseError.url = null;
};
Document.prototype.__checkForErrors__ = function () {
if (this.documentElement.tagName == "parsererror") {
var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;
reError.test(this.xml);
this.parseError.errorCode = -999999;
this.parseError.reason = RegExp.$1;
this.parseError.url = RegExp.$2;
this.parseError.line = parseInt(RegExp.$3);
this.parseError.linepos = parseInt(RegExp.$4);
this.parseError.srcText = RegExp.$5;
}
};
//¶¨ÒåMozillaµÄloadXML·½·¨
Document.prototype.loadXML = function (sXml) {
this.__initError__();
this.__changeReadyState__(1);
var oParser = new DOMParser();
var oXmlDom = oParser.parseFromString(sXml, "text/xml");
while (this.firstChild) {
this.removeChild(this.firstChild);
}
for (var i=0; i < oXmlDom.childNodes.length; i++) {
var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
this.appendChild(oNewNode);
}
//ÔØÈëºó¼ì²é´íÎó
this.__checkForErrors__();
//ûÓÐÎÊÌ⣬ÉèÖÃreadyStateÊôÐÔΪ4
this.__changeReadyState__(4);
};
Document.prototype.__load__ = Document.prototype.load;
Document.prototype.load = function (sURL) {
this.__initError__();
this.__changeReadyState__(1);
this.__load__(sURL);
};
Node.prototype.__defineGetter__("xml", function () {
var oSerializer = new XMLSerializer();
return oSerializer.serializeToString(this, "text/xml");
});
}