Skip to content

Instantly share code, notes, and snippets.

@keeto
Created March 2, 2011 13:55
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save keeto/850960 to your computer and use it in GitHub Desktop.
Save keeto/850960 to your computer and use it in GitHub Desktop.
/* XML Methods for MooTools */
/* Requires MooTools v1.3 */
var XML = {
rootFromFile: function(file){
var root = null;
switch (Browser.name){
case 'safari':
case 'chrome':
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('GET', file, false);
xmlhttp.send(null);
return xmlhttp.responseXML;
case 'ie': root = new ActiveXObject('Microsoft.XMLDOM');
default: root = root || document.implementation.createDocument('', '', null);
}
root.async = false;
root.load(file);
return root;
},
rootFromString: function(string){
var root;
if (Browser.ie){
root = new ActiveXObject('Microsoft.XMLDOM');
root.async = false;
root.loadXML(string);
} else {
root = new DOMParser().parseFromString(string, 'text/xml');
}
return root;
},
rootToHashes: function(root){
var hashes = [], children = root.childNodes;
for (var i = 0, l = children.length; i < l; i++){
var hash = XML.nodeToHash(children[i]);
if (hash) hashes.push(hash);
}
return hashes;
},
nodeToHash: function(node){
switch (typeOf(node)){
case 'element':
var attributes = node.attributes;
var attributesLength = attributes.length;
var attributesHash = {};
for (var j = 0; j < attributesLength; j++){
var attribute = attributes[j];
if (attribute.nodeValue && attribute.nodeValue != 'inherit') attributesHash[attribute.nodeName] = attribute.nodeValue;
}
return {tag: node.nodeName.toLowerCase(), attributes: attributesHash, children: XML.rootToHashes(node)};
case 'textnode': return {text: node.nodeValue};
default: return null;
}
},
hashesToTree: function(hash){
var tree = [];
for (var i = 0, l = hash.length; i < l; i++) tree.push(XML.hashToElement(hash[i]));
return tree;
},
hashToElement: function(hash, tag){
var element;
if (hash.text) element = document.newTextNode(hash.text);
else element = document.newElement(tag || hash.tag, hash.attributes).adopt(XML.hashesToTree(hash.children));
return element;
},
hashToHTML: function(hash, level){
var tabs = new Array(level || 0).join('\t');
if (hash.text) return tabs + hash.text;
var attributes = [''];
for (var p in hash.attributes) attributes.push(p + '="' + hash.attributes[p] + '"');
attributes = attributes.join(' ');
var open = tabs + '<' + hash.tag + attributes + '>\n';
var close = '\n' + tabs + '</' + hash.tag + '>';
var children = XML.hashesToHTML(hash.children, level + 1);
return open + children + close;
},
hashesToHTML: function(hashes, level){
var html = [];
for (var i = 0, l = hashes.length; i < l; i++) html.push(XML.hashToHTML(hashes[i], level));
return html.join('\n');
},
transform: function(xml, xsl){
xml = (typeof xml == 'string') ? XML.rootFromFile(xml) : xml;
xsl = (typeof xsl == 'string') ? XML.rootFromFile(xsl) : xsl;
var temp = document.newElement('div');
if (Browser.ie){
var html = xml.transformNode(xsl);
temp.innerHTML = html;
} else {
var xslt = new XSLTProcessor();
xslt.importStylesheet(xsl);
var root = xslt.transformToFragment(xml, document);
temp.appendChild(root);
}
var children = [];
for (var i = 0, l = temp.childNodes.length; i < l; i++){
var element = temp.childNodes[i], type = typeOf(element);
if (type == 'element' || type == 'textnode') children.push(element);
}
return children;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment