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 + -
显示快捷键?