xml.js

来自「进行ajax开发sdsd s d sd s」· JavaScript 代码 · 共 520 行 · 第 1/2 页

JS
520
字号
/** * xml.js: utilities for creating, loading, parsing, serializing, *         transforming and extracting data from XML documents. * * From the book JavaScript: The Definitive Guide, 5th Edition, * by David Flanagan. Copyright 2006 O'Reilly Media, Inc. (ISBN: 0596101996) */// Make sure we haven't already been loadedvar XML;if (XML && (typeof XML != "object" || XML.NAME))    throw new Error("Namespace 'XML' already exists");// Create our namespace, and specify some meta-informationXML = {};XML.NAME = "XML";     // The name of this namespaceXML.VERSION = 1.0;    // The version of this namespace/** * Create a new Document object.  If no arguments are specified,  * the document will be empty.  If a root tag is specified, the document * will contain that single root tag.  If the root tag has a namespace * prefix, the second argument must specify the URL that identifies the * namespace. */XML.newDocument = function(rootTagName, namespaceURL) {    if (!rootTagName) rootTagName = "";    if (!namespaceURL) namespaceURL = "";        if (document.implementation && document.implementation.createDocument) {        // This is the W3C standard way to do it        return document.implementation.createDocument(namespaceURL,                                                      rootTagName, null);    }    else { // This is the IE way to do it        // Create an empty document as an ActiveX object        // If there is no root element, this is all we have to do        var doc = new ActiveXObject("MSXML2.DOMDocument");        // If there is a root tag, initialize the document        if (rootTagName) {            // Look for a namespace prefix            var prefix = "";            var tagname = rootTagName;            var p = rootTagName.indexOf(':');            if (p != -1) {                prefix = rootTagName.substring(0, p);                tagname = rootTagName.substring(p+1);            }            // If we have a namespace, we must have a namespace prefix            // If we don't have a namespace, we discard any prefix            if (namespaceURL) {                if (!prefix) prefix = "a0"; // What Firefox uses            }            else prefix = "";            // Create the root element (with optional namespace) as a            // string of text            var text = "<" + (prefix?(prefix+":"):"") +  tagname +                (namespaceURL                 ?(" xmlns:" + prefix + '="' + namespaceURL +'"')                 :"") +                "/>";            // And parse that text into the empty document            doc.loadXML(text);        }        return doc;    }};/** * Synchronously load the XML document at the specified URL and * return it as a Document object */XML.load = function(url) {    // Create a new document the previously defined function    var xmldoc = XML.newDocument();      xmldoc.async = false;  // We want to load synchronously    xmldoc.load(url);      // Load and parse    return xmldoc;         // Return the document};/** * Asynchronously load and parse an XML document from the specified URL. * When the document is ready, pass it to the specified callback function. * This function returns immediately with no return value. */XML.loadAsync = function(url, callback) {    var xmldoc = XML.newDocument();    // If we created the XML document using createDocument, use    // onload to determine when it is loaded    if (document.implementation && document.implementation.createDocument) {        xmldoc.onload = function() { callback(xmldoc); };    }    // Otherwise, use onreadystatechange as with XMLHttpRequest    else {        xmldoc.onreadystatechange = function() {            if (xmldoc.readyState == 4) callback(xmldoc);        };    }    // Now go start the download and parsing    xmldoc.load(url);};/** * Parse the XML document contained in the string argument and return  * a Document object that represents it. */XML.parse = function(text) {    if (typeof DOMParser != "undefined") {        // Mozilla, Firefox, and related browsers        return (new DOMParser()).parseFromString(text, "application/xml");    }    else if (typeof ActiveXObject != "undefined") {        // Internet Explorer.        var doc = XML.newDocument();  // Create an empty document        doc.loadXML(text);            // Parse text into it        return doc;                   // Return it    }    else {        // As a last resort, try loading the document from a data: URL        // This is supposed to work in Safari.  Thanks to Manos Batsis and        // his Sarissa library (sarissa.sourceforge.net) for this technique.        var url = "data:text/xml;charset=utf-8," + encodeURIComponent(text);        var request = new XMLHttpRequest();        request.open("GET", url, false);        request.send(null);        return request.responseXML;    }};/** * Return a Document object that holds the contents of the <xml> tag * with the specified id.  If the <xml> tag has a src attribute, an XML * document is loaded from that URL and returned instead. * * Since data islands are often looked up more than once, this function caches * the documents it returns. */XML.getDataIsland = function(id) {    var doc;    // Check the cache first    doc = XML.getDataIsland.cache[id];    if (doc) return doc;        // Look up the specified element    doc = document.getElementById(id);    // If there is a "src" attribute, fetch the Document from that URL    var url = doc.getAttribute('src');    if (url) {        doc = XML.load(url);    }    // Otherwise, if there was no src attribute, the content of the <xml>    // tag is the document we want to return.  In Internet Explorer, doc is    // already the document object we want. In other browsers, doc refers to    // an HTML element, and we've got to copy the content of that element    // into a new document object    else if (!doc.documentElement) {// If this is not already a document...        // First, find the document element within the <xml> tag.  This is        // the first child of the <xml> tag that is an element, rather        // than text, comment or processing instruction        var docelt = doc.firstChild;        while(docelt != null) {            if (docelt.nodeType == 1 /*Node.ELEMENT_NODE*/) break;            docelt = docelt.nextSibling;        }                // Create an empty document        doc = XML.newDocument();                // If the <xml> node had some content, import it into the new document        if (docelt) doc.appendChild(doc.importNode(docelt, true));    }    // Now cache and return the document.    XML.getDataIsland.cache[id] = doc;    return doc;};XML.getDataIsland.cache = {}; // Initialize the cache/** * This XML.Transformer class encapsulates an XSL stylesheet. * If the stylesheet parameter is a URL, we load it. * Otherwise, we assume it is an appropriate DOM Document */XML.Transformer = function(stylesheet) {    // Load the stylesheet if necessary    if (typeof stylesheet == "string") stylesheet = XML.load(stylesheet);    this.stylesheet = stylesheet;    // In Mozilla-based browsers, create an XSLTProcessor object and    // tell it about the stylesheet.    if (typeof XSLTProcessor != "undefined") {        this.processor = new XSLTProcessor();        this.processor.importStylesheet(this.stylesheet);    }};/** * This is the transform() method of the XML.Transformer class. * It transforms the specified xml node using the encapsulated stylesheet. * The results of the transformation are assumed to be HTML and are used to * replace the content of the specified element */XML.Transformer.prototype.transform = function(node, element) {    // If element is specified by id, look it up    if (typeof element == "string") element = document.getElementById(element);    if (this.processor) {        // If we've created an XSLTProcessor (i.e. we're in Mozilla) use it.        // Transform the node into a DOM DocumentFragment        var fragment = this.processor.transformToFragment(node, document);        // Erase the existing content of element        element.innerHTML = "";        // And insert the transformed nodes        element.appendChild(fragment);    }    else if ("transformNode" in node) {        // If the node has a transformNode() function (in IE), use that.        // Note that transformNode() returns a string.        element.innerHTML = node.transformNode(this.stylesheet);    }    else {        // Otherwise, we're out of luck        throw "XSLT is not supported in this browser";    }};/** * This is an XSLT utility function that is useful when a stylesheet is * used only once. */XML.transform = function(xmldoc, stylesheet, element) {    var transformer = new XML.Transformer(stylesheet);    transformer.transform(xmldoc, element);}/** * XML.XPathExpression is a class that encapsulates an XPath query and its * associated namespace prefix-to-URL mapping.  Once an XML.XPathExpression * object has been created, it can be evaluated one or more times (in one * or more contexts) using the getNode() or getNodes() methods. * * The first argument to this constructor is the text of the XPath expression. *  * If the expression includes any XML namespaces, the second argument must * be a JavaScript object that maps namespace prefixes to the URLs that define * those namespaces.  The properties of this object are the prefixes, and * the values of those properties are the URLs. */XML.XPathExpression = function(xpathText, namespaces) {    this.xpathText = xpathText;    // Save the text of the expression    this.namespaces = namespaces;  // And the namespace mapping

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?