Javascript庫,Firefox操作XML DOM

在IE中載入一個XML DoM後可以用.xml屬性來取得DOM的XML字符串,而在Firefox中沒有這個屬性。 在Firefox中引用

/*------------------------------------------------------------------------------

 * JavaScript zXml Library

 * Version 1.0.2

 * by Nicholas C. Zakas, http://www.nczonline.net/

 * Copyright (c) 2004-2006 Nicholas C. Zakas. All Rights Reserved.

 *

 * This program is free software; you can redistribute it and/or modify

 * it under the terms of the GNU Lesser General Public License as published by

 * the Free Software Foundation; either version 2.1 of the License, or

 * (at your option) any later version.

 *

 * This program is distributed in the hope that it will be useful,

 * but WITHOUT ANY WARRANTY; without even the implied warranty of

 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

 * GNU Lesser General Public License for more details.

 *

 * You should have received a copy of the GNU Lesser General Public License

 * along with this program; if not, write to the Free Software

 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA

 *------------------------------------------------------------------------------

 */  



 

var zXml /*:Object*/ = {

    useActiveX: (typeof ActiveXObject != "undefined"),

    useDom: document.implementation && document.implementation.createDocument,

    useXmlHttp: (typeof XMLHttpRequest != "undefined")

};



zXml.ARR_XMLHTTP_VERS /*:Array*/ = ["MSXML2.XmlHttp.6.0","MSXML2.XmlHttp.3.0"];



zXml.ARR_DOM_VERS /*:Array*/ = ["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.3.0"];

                   

/**

 * Static class for handling XMLHttp creation.

 * @class

 */                     

function zXmlHttp() {

}



/**

 * Creates an XMLHttp object.

 * @return An XMLHttp object.

 */

zXmlHttp.createRequest = function ()/*:XMLHttp*/ {



    //if it natively supports XMLHttpRequest object

    if (zXml.useXmlHttp) {

        return new XMLHttpRequest();

    } else if (zXml.useActiveX) { //IE < 7.0 = use ActiveX

  

        if (!zXml.XMLHTTP_VER) {

            for (var i=0; i < zXml.ARR_XMLHTTP_VERS.length; i++) {

                try {

                    new ActiveXObject(zXml.ARR_XMLHTTP_VERS[i]);

                    zXml.XMLHTTP_VER = zXml.ARR_XMLHTTP_VERS[i];

                    break;

                } catch (oError) {                

                }

            }

        }

        

        if (zXml.XMLHTTP_VER) {

            return new ActiveXObject(zXml.XMLHTTP_VER);

        } else {

            throw new Error("Could not create XML HTTP Request.");

        }

    } else {

        throw new Error("Your browser doesn't support an XML HTTP Request.");

    }



};



/**

 * Indicates if XMLHttp is available.

 * @return True if XMLHttp is available, false if not.

 */

zXmlHttp.isSupported = function ()/*:Boolean*/ {

    return zXml.useXmlHttp || zXml.useActiveX;

};





/**

 * Static class for handling XML DOM creation.

 * @class

 */

function zXmlDom() {



}



/**

 * Creates an XML DOM document.

 * @return An XML DOM document.

 */

zXmlDom.createDocument = function () /*:XMLDocument*/{



    if (zXml.useDom) {



        var oXmlDom = document.implementation.createDocument("","",null);



        oXmlDom.parseError = {

            valueOf: function () { return this.errorCode; },

            toString: function () { return this.errorCode.toString() }

        };

        

        oXmlDom.__initError__();

                

        oXmlDom.addEventListener("load", function () {

            this.__checkForErrors__();

            this.__changeReadyState__(4);

        }, false);



        return oXmlDom;        

        

    } else if (zXml.useActiveX) {

        if (!zXml.DOM_VER) {

            for (var i=0; i < zXml.ARR_DOM_VERS.length; i++) {

                try {

                    new ActiveXObject(zXml.ARR_DOM_VERS[i]);

                    zXml.DOM_VER = zXml.ARR_DOM_VERS[i];

                    break;

                } catch (oError) {                

                }

            }

        }

        

        if (zXml.DOM_VER) {

            return new ActiveXObject(zXml.DOM_VER);

        } else {

            throw new Error("Could not create XML DOM document.");

        }

    } else {

        throw new Error("Your browser doesn't support an XML DOM document.");

    }



};



/**

 * Indicates if an XML DOM is available.

 * @return True if XML DOM is available, false if not.

 */

zXmlDom.isSupported = function ()/*:Boolean*/ {

    return zXml.useDom || zXml.useActiveX;

};



//Code to make Mozilla DOM documents act more like MS DOM documents.

var oMozDocument = null;

if (typeof XMLDocument != "undefined") {

    oMozDocument = XMLDocument;

} else if (typeof Document != "undefined") {

    oMozDocument = Document;

}



if (oMozDocument && !window.opera) {



    oMozDocument.prototype.readyState = 0;

    oMozDocument.prototype.onreadystatechange = null;



    oMozDocument.prototype.__changeReadyState__ = function (iReadyState) {

        this.readyState = iReadyState;



        if (typeof this.onreadystatechange == "function") {

            this.onreadystatechange();

        }

    };



    oMozDocument.prototype.__initError__ = function () {

        if (this.parseError)

        {

            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;

        }

    };

    

    oMozDocument.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;

        }

    };

            

    oMozDocument.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__();

        

        this.__changeReadyState__(4);



    };

    

    oMozDocument.prototype.transformNode = function (oXslt) {

    

        return zXslt.transformToText(this, oXslt);  



    };



    oMozDocument.prototype.__load__ = oMozDocument.prototype.load;



    oMozDocument.prototype.load = function (sURL) {

        this.__initError__();

        this.__changeReadyState__(1);

        this.__load__(sURL);

    };

    

    Document.prototype.__defineGetter__("xml", function () {

        var oSerializer = new XMLSerializer();

        return oSerializer.serializeToString(this, "text/xml");

    });

    

    Node.prototype.__defineGetter__("xml", function () {

        var oSerializer = new XMLSerializer();

        return oSerializer.serializeToString(this, "text/xml");

    });



    Node.prototype.__defineGetter__("text", function () {

        var sText = "";

        for (var i = 0; i < this.childNodes.length; i++) {

            if (this.childNodes[i].hasChildNodes()) {

                sText += this.childNodes[i].text;

            } else {

                sText += this.childNodes[i].nodeValue;

            }

        }

        return sText;



    });



}



/**

 * Static class for handling XSLT transformations.

 * @class

 */

function zXslt() {

}



/**

 * Transforms an XML DOM to text using an XSLT DOM.

 * @param oXml The XML DOM to transform.

 * @param oXslt The XSLT DOM to use for the transformation.

 * @return The transformed version of the string.

 */

zXslt.transformToText = function (oXml /*:XMLDocument*/, oXslt /*:XMLDocument*/)/*:String*/ {

    if (typeof XSLTProcessor != "undefined") {

        var oProcessor = new XSLTProcessor();

        oProcessor.importStylesheet(oXslt);

    

        var oResultDom = oProcessor.transformToDocument(oXml);

        var sResult = oResultDom.xml;

    

        if (sResult.indexOf("<transformiix:result") > -1) {

            sResult = sResult.substring(sResult.indexOf(">") + 1, 

                                        sResult.lastIndexOf("<"));

        }

    

        return sResult;     

    } else if (zXml.useActiveX) {

        return oXml.transformNode(oXslt);

    } else {

        throw new Error("No XSLT engine found.");

    }

};



/**

 * Static class for handling XPath evaluation.

 * @class

 */

function zXPath() {



}



/**

 * Selects the first node matching a given XPath expression.

 * @param oRefNode The node from which to evaluate the expression.

 * @param sXPath The XPath expression.

 * @param oXmlNs An object containing the namespaces used in the expression. Optional.

 * @return An XML node matching the expression or null if no matches found.

 */

zXPath.selectNodes = function (oRefNode /*:Node*/, sXPath /*:String*/, oXmlNs /*:Object*/) {

    if (typeof XPathEvaluator != "undefined") {

    

        oXmlNs = oXmlNs || {};

        

        var nsResolver = function (sPrefix) {

                  return oXmlNs[sPrefix];

        };

        

        var oEvaluator = new XPathEvaluator();

        var oResult = oEvaluator.evaluate(sXPath, oRefNode, nsResolver, 

                                          XPathResult.ORDERED_NODE_ITERATOR_TYPE, 

                                          null);



        var aNodes = new Array;

        

        if (oResult != null) {

            var oElement = oResult.iterateNext();

            while(oElement) {

                aNodes.push(oElement);

                oElement = oResult.iterateNext();

            }

        }

        

        return aNodes;

        

    } else if (zXml.useActiveX) {

            if (oXmlNs) {

            var sXmlNs = "";

            for (var sProp in oXmlNs) {

                sXmlNs += "xmlns:" + sProp + "=/'" + oXmlNs[sProp] + "/' ";

            }

                  oRefNode.ownerDocument.setProperty("SelectionNamespaces", sXmlNs);

            }          

        return oRefNode.selectNodes(sXPath);

    } else {

        throw new Error("No XPath engine found.");

    }



};



/**

 * Selects the first node matching a given XPath expression.

 * @param oRefNode The node from which to evaluate the expression.

 * @param sXPath The XPath expression.

 * @param oXmlNs An object containing the namespaces used in the expression.

 * @return An XML node matching the expression or null if no matches found.

 */

zXPath.selectSingleNode = function (oRefNode /*:Node*/, sXPath /*:String*/, oXmlNs /*:Object*/) {

    if (typeof XPathEvaluator != "undefined") {            

    

        oXmlNs = oXmlNs || {};

        

        var nsResolver = function (sPrefix) {

            if(sPrefix == 'xsl') {    

                return 'http://www.w3.org/1999/XSL/Transform';  

            }  

            else

            {

                  return oXmlNs[sPrefix];

            }

        };

    

        var oEvaluator = new XPathEvaluator();

        var oResult = oEvaluator.evaluate(sXPath, oRefNode, nsResolver,

                                          XPathResult.FIRST_ORDERED_NODE_TYPE, null);

    

        if (oResult != null) {

            return oResult.singleNodeValue;

        } else {

            return null;

        }              

    

    } else if (zXml.useActiveX) {

            if (oXmlNs) {

            var sXmlNs = "";

            for (var sProp in oXmlNs) {

                sXmlNs += "xmlns:" + sProp + "=/'" + oXmlNs[sProp] + "/' ";

            }

                  oRefNode.ownerDocument.setProperty("SelectionNamespaces", sXmlNs);

            }    

        return oRefNode.selectSingleNode(sXPath);

    } else {

        throw new Error("No XPath engine found.")

    }



};



/**

 * General purpose XML serializer.

 * @class

 */

function zXMLSerializer() {



}



/**

 * Serializes the given XML node into an XML string.

 * @param oNode The XML node to serialize.

 * @return An XML string.

 */

zXMLSerializer.prototype.serializeToString = function (oNode /*:Node*/)/*:String*/ {



    var sXml = "";

    

    switch (oNode.nodeType) {

        case 1: //element

            sXml = "<" + oNode.tagName;

            

            for (var i=0; i < oNode.attributes.length; i++) {

                sXml += " " + oNode.attributes[i].name + "=/"" + oNode.attributes[i].value + "/"";

            }

            

            sXml += ">";

            

            for (var i=0; i < oNode.childNodes.length; i++){

                sXml += this.serializeToString(oNode.childNodes[i]);

            }

            

            sXml += "</" + oNode.tagName + ">";

            break;

            

        case 3: //text node

            sXml = oNode.nodeValue;

            break;

        case 4: //cdata

            sXml = "<![CDATA[" + oNode.nodeValue + "]]>";

            break;

        case 7: //processing instruction

            sXml = "<?" + oNode.nodevalue + "?>";

            break;

        case 8: //comment

            sXml = "<!--" + oNode.nodevalue + "-->";

            break;

        case 9: //document

            for (var i=0; i < oNode.childNodes.length; i++){

                sXml += this.serializeToString(oNode.childNodes[i]);

            }

            break;

            

    }  

    

    return sXml;

};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章