zXml使用问题

时间:2014-09-15 05:51:40

标签: javascript xml xml-parsing cross-browser

所以,我想使用zXml库来理清浏览器之间关于XML使用和从服务器检索的差异。

我已经准备好以下代码,而且我对这个错误感到难过。提前谢谢!

if(navigator.appName == "Microsoft Internet Explorer") {
        // This snippet works perfectly fine with ActiveXObject. :)
} else //Other browsers {
    var zxmldom = zXmlDom.createDocument();
    zxmldom.async = false;

    zxmldom.load("devices.xml");
    alert(zxmldom.documentElement.text); //testing whether XML is getting retrieved properly        
}

1 个答案:

答案 0 :(得分:1)

我做了一些更改来解决zxml.js问题。希望它会有所帮助。

var zXml = {
    useActiveX: (window.ActiveXObject || "ActiveXObject" in window),
    useDom: document.implementation && document.implementation.createDocument && !(window.ActiveXObject || "ActiveXObject" in window),
    useXmlHttp: (typeof XMLHttpRequest != "undefined") && !(window.ActiveXObject || "ActiveXObject" in window)
};

zXml.ARR_XMLHTTP_VERS = ["MSXML2.XmlHttp.6.0", "MSXML2.XmlHttp.3.0"];
zXml.ARR_DOM_VERS = ["MSXML2.DOMDocument.6.0", "MSXML2.DOMDocument.3.0", "Microsoft.XMLDOM"];

function zXmlHttp() { }

zXmlHttp.createRequest = function () {
    if (zXml.useXmlHttp) {
        return new XMLHttpRequest();
    } else if (zXml.useActiveX) {
        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.");
    }
};

zXmlHttp.isSupported = function () {
    return zXml.useXmlHttp || zXml.useActiveX;
};

function zXmlDom() { }
zXmlDom.createDocument = function () {
    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.");
    }
};

zXmlDom.isSupported = function () {
    return zXml.useDom || zXml.useActiveX;
};

var oMozDocument = null;
if (typeof XMLDocument != "undefined") {
    oMozDocument = XMLDocument;
} else if (typeof Document != "undefined") {
    oMozDocument = Document;
}
if (oMozDocument && !window.opera && !!document.evaluate) {
    oMozDocument.prototype.readyState = 0;
    try {
        oMozDocument.prototype.onreadystatechange = null;
    } catch (oError) { ; }
    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.selectNodes = function (sXPath) { return zXPath.selectNodes(this, sXPath, null); };
    Node.prototype.selectSingleNode = function (sXPath) { return zXPath.selectSingleNode(this, sXPath, null); };

    Object.defineProperty(Node.prototype, "xml", {
        get: function () {
            var oSerializer = new XMLSerializer();
            return oSerializer.serializeToString(this, "text/xml");
        }
    });
    Object.defineProperty(Node.prototype, "text", {
        set: function (val) {
            this.textContent = val;
        },

        get: 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;
        }
    });
}

function zXslt() { }
zXslt.transformToText = function (oXml, oXslt) {
    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.");
    }
};

function zXPath() { }
zXPath.selectNodes = function (oRefNode, sXPath, oXmlNs) {
    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.");
    }
};

zXPath.selectSingleNode = function (oRefNode, sXPath, oXmlNs) {
    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.");
    }
};

function zXMLSerializer() { }
zXMLSerializer.prototype.serializeToString = function (oNode) {
    var sXml = "";
    switch (oNode.nodeType) {
        case 1: 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: sXml = oNode.nodeValue;
            break;
        case 4: sXml = "<![CDATA[" + oNode.nodeValue + "]]>";
            break;
        case 7: sXml = "<?" + oNode.nodevalue + "?>";
            break;
        case 8: sXml = "<!--" + oNode.nodevalue + "-->";
            break;
        case 9: for (var i = 0; i < oNode.childNodes.length; i++) {
                sXml += this.serializeToString(oNode.childNodes[i]);
            } break;
    };
    return sXml;
};


var textXml = "<ROOT>Hello World</ROOT>";
var obj = zXmlDom.createDocument();
obj.loadXML(textXml);
alert(obj.childNodes[0].text);