XML處理函數

來源:互聯網
上載者:User
 <!--
/*------------------------------------------------------------------------------
*
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 () {
        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.__load__
= oMozDocument.prototype.load;

    oMozDocument.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");
    });

    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)
{
                  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;
};
//-->

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.