xml = { // ELEMENT_NODE : 1, // ATTRIBUTE_NODE : 2, // TEXT_NODE : 3, // CDATA_SECTION_NODE : 4, // PROCESSING_INSTRUCTION_NODE : 7, // COMMENT_NODE : 8, // DOCUMENT_NODE : 9, // DOCUMENT_TYPE_NODE : 10, // DOCUMENT_FRAGMENT_NODE : 11, /** * Parse the specified XML text into a XML document object. * * @param {String} * xmlText * @return {XMLDocument} */ parse : function(xmlText) { if (typeof DOMParser !== 'undefined') { // W3C(Mozilla Firefox, Safari) or IE 9 (standard mode) return (new DOMParser()).parseFromString(xmlText, 'text/xml'); } else if (typeof ActiveXObject !== 'undefined') { // IE6 ~ IE8 var doc = new ActiveXObject('Microsoft.XMLDOM'); doc.async = 'false'; doc.loadXML(xmlText); return doc; } else { // Safari var url = 'data:text/xml;charset=utf-8,' + encodeURIComponent(xmlText); var request = new XMLHttpRequest(); request.open('GET', url, false); request.send(null); doc = request.responseXML; return doc; } }, /** * Serialize the XML Object into string/text. * * @param {XMLNode} * xmlObject * @return {String} */ serialize : function(xmlObject) { if (xmlObject.xml) { // IE6 ~ IE8 return xmlObject.xml; } else { // W3C(Mozilla Firefox, Safari) or IE 9 (standard mode) return (new XMLSerializer()).serializeToString(xmlObject); } }, /** * Create a XML document object. * * @param {String} * rootTagName * @param {String} * namespaceURL * @return {XMLDocument} */ create : function(rootTagName, namespaceURL) { rootTagName = rootTagName || ''; namespaceURL = namespaceURL || ''; if (document.implementation && document.implementation.createDocument) { // W3C return document.implementation.createDocument(namespaceURL, rootTagName, null); } else { // IE6 ~ IE8 var doc = new ActiveXObject('MSXML2.DOMDocument'); if (rootTagName) { var prefix = ''; var tagName = rootTagName; var p = rootTagName.indexOf(':'); if (p != -1) { prefix = rootTagName.substring(0, p); tagName = rootTagName.substring(p + 1); } if (namespaceURL) { if (!prefix) { prefix = 'a0'; // What Firefox uses } } else { prefix = ''; } var text = '<' + (prefix ? (prefix + ':') : '') + tagName + (namespaceURL ? (' xmlns:' + prefix + '="' + namespaceURL + '"') : '') + '/>'; doc.loadXML(text); } return doc; } }, /** * Load XML document from the sepcified url synchronously. * * @param {String} * url * @return {XMLDocument} */ loadSync : function(url) { var doc = (document.implementation && document.implementation.createDocument) ? document.implementation.createDocument(null, null, null) : new ActiveXObject('MSXML2.DOMDocument'); if (doc) { doc.async = false; try { doc.load(url); } catch (e) { doc = null; } if (doc) { return doc; } } else { // Method 2: use XMLHttpRequest if (window.XMLHttpRequest && !window.ActiveXObject) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.send(null); return xhr.responseXML; } else { doc = new ActiveXObject('Microsoft.XMLDOM'); doc.async = false; doc.load(url); return doc; } } }, /** * Load xml document from the sepcified url asynchronously. * * @param {String} * url * @param {Function} * callback */ loadAsync : function(url, callback) { var doc = (document.implementation && document.implementation.createDocument) ? document.implementation.createDocument(null, null, null) : new ActiveXObject('MSXML2.DOMDocument'); if (doc) { doc.async = true; if (document.implementation && document.implementation.createDocument) { // W3C doc.onload = function() { callback(doc); }; } else { // IE doc.onreadystatechange = function() { if (doc.readyState == 4) { callback(doc); } else { throw new Error('Failed loading XML doc. readyState=' + doc.readyState); } }; } doc.load(url); } else { // Method 2: use XMLHttpRequest if (window.XMLHttpRequest && !window.ActiveXObject) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { callback(xhr.responseXML); } else { throw new Error('XMLHttpRequest failed with readystate: ' + xhr.readyState); } } } else { doc = new ActiveXObject('Microsoft.XMLDOM'); if (callback) { doc.async = true; doc.onreadystatechange = function() { if (doc.readyState == 4) { callback(doc); } else { throw new Error('Failed loading XML doc. readyState=' + doc.readyState); } } doc.load(url); } } } }, /** * Select single node from the specified XML object(node) by evaluate the * specified xpath expression. * * @param {XMLNode} * xmlObject * @param {String} * xpath * @return {XMLNode} */ selectSingleNode : function(xmlObject, xpath) { var node = null; if (window.ActiveXObject && typeof xmlObject.selectSingleNode !== 'undefined') { // IE: MSXML object node = xmlObject.selectSingleNode(xpath); } else if (window.XPathEvaluator && document.implementation.hasFeature('XPath', '3.0')) { // W3C Browsers // FIRST_ORDERED_NODE_TYPE returns the first match to the xpath. var result = (new XPathEvaluator()).evaluate(xpath, xmlObject, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); if (typeof result != 'undefined' && result != null) { node = result.singleNodeValue; } } return node; }, /** * Select single value from the specified XML object(node) by evaluate the * specified xpath expression. * * @param {XMLNode} * xmlObject * @param {String} * xpath * @return {String} */ selectSingleValue : function(xmlObject, xpath) { var value; var node = xml.selectSingleNode(xmlObject, xpath); if (node) { if (node.nodeType === 2) { // ATTRIBUTE_NODE : 2 value = node.nodeValue; } else if (node.nodeType === 1) { // ELEMENT_NODE : 1 node.normalize(); for (var j = 0; j < node.childNodes.length; j++) { var childNode = node.childNodes[j]; if (childNode.nodeType === 3) { // TEXT_NODE : 3 value = childNode.nodeValue; break; } } } } return value; }, /** * Select a set of XML nodes from the specified xmlObject by evaluate the * specified xpath expression. * * @param {XMLNode} * xmlObject * @param {String} * xpath * @return {[XMLNode]} */ selectNodes : function(xmlObject, xpath) { var nodes = []; if (window.ActiveXObject && typeof xmlObject.selectNodes !== 'undefined') { nodes = xmlObject.selectNodes(xpath); } else if (window.XPathEvaluator && document.implementation.hasFeature('XPath', '3.0')) { var nsResolver = function(prefix) { return prefix; } var result = (new XPathEvaluator()).evaluate(xpath, xmlObject, nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); var nodes = []; if (typeof result != 'undefined' && result != null) { var node; while (node = result.iterateNext()) { nodes.push(node); } } } return nodes; }, /** * Select a set of XML node values from the specified xmlObject by evaluate * the specified xpath expression. * * @param {XMLNode} * xmlObject * @param {String} * xpath * @return {[String]} value set */ selectValues : function(xmlObject, xpath) { var values = []; var nodes = xml.selectNodes(xmlObject, xpath); if (typeof nodes !== 'undefined' && nodes != null) { for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; switch (node.nodeType) { case 2 : // ATTRIBUTE_NODE : 2 values.push(node.nodeValue); break; case 1 : // ELEMENT_NODE : 1 node.normalize(); var text; for (var j = 0; j < node.childNodes.length; j++) { var childNode = node.childNodes[j]; if (childNode.nodeType === 3) { // TEXT_NODE : 3 text = childNode.nodeValue; break; } } if (typeof text !== 'undefined' && text != null) { values.push(text); } break; } } } return values; } };
Search This Blog
a complete javascript XML library
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment