Generating XML from JavaScript
Generating XML from JavaScript:
When to use these functions:
About the image: well, I just liked it.
// Create an XML element.
function createXMLElement(parent, name, data)
{
var node = new Object();
node["parent"] = parent;
node["name"] = name;
node["data"] = data;
node["children"] = new Array();
node["attributes"] = new Array();
return node;
}
//Add child
function addXMLChild(parent, child)
{
child["parent"] = parent;
parent["children"].push(child);
}
// XML library: add a child
function addXMLChildAtPos(parent, child,pos)
{
child["parent"] = parent;
parent["children"].splice(pos,0,child);
}
//add Atrribute
function addXMLAttribute(node, attributename, value)
{
var attr = new Object();
attr[attributename] = value;
node["attributes"].push(attr);
}
// Helper function to generate indentation levels
function gentabs(howmany)
{
var str = "";
for (var k = 0; k < howmany; k++)
{
str += "\t";
}
return str;
}
//Generate XML for the given element
function generateXML(element, level)
{
var str = "";
if (level == null)
{
var level = 0;
str = "<?xml version=\"1.0\"?>\n";
}
var indent = gentabs(level);
str += indent + "<" + element["name"];
for (var k = 0; k < element["attributes"].length; k++)
{
var attr = element["attributes"][k];
for (property in attr)
{
str += " " + property + "='" + attr[property] + "'";
}
}
str += ">\n";
for (var i = 0; i < element["children"].length; i++)
{
var child = element["children"][i];
str += extractXML(child, level + 1);
}
str += indent + " "+ element["data"] + "\n";
str += indent + "</" + element["name"] + ">\n";
return str;
}
Example:
var root = createXMLElement(null, "root", "root data");
var child = createXMLElement(root, "child0", "child0 data");
addXMLAttribute(child, "test", "abc");
addXMLChild(root, child);
var child11 = createXMLElement(child, "child11", "child11 data");
addXMLChild(child, child11);
alert(generateXML(root));
Update; Atom detection:
This version detects when an element has got no children and no associated data and turns it into an atom:
function extractXML(element, level)
{
var str = "";
if (level == null)
{
var level = 0;
str = "<?xml version=\"1.0\"?>\n";
}
var indent = gentabs(level);
str += indent + "<" + element["name"];
for (var k = 0; k < element["attributes"].length; k++)
{
var attr = element["attributes"][k];
for (property in attr)
{
str += " " + property + "='" + attr[property] + "'";
}
}
if (element["children"].length==0)
{
var l=String(element["data"]);
if (l.length==0)
{
str+="/>";
return str;
}
}
str += ">\n";
for (var i = 0; i < element["children"].length; i++)
{
var child = element["children"][i];
str += extractXML(child, level + 1);
}
if (element["data"]!=null)
{
var l=String(element["data"]).trim();
if (l.length>0)
str += indent + " "+ element["data"] +"\n";
}
str += indent + "</" + element["name"] + ">\n";
return str;
}
Find a Child
// Find a child
function findXMLChild(parent,childname)
{
var result=[];
for (var i=0;i<parent["children"].length;i++)
{
var child=parent["children"][i];
//stdout.println("finder:"+child["name"]);
if (child["name"]==childname)
result.push(child);
}
return result;
}
Get attribute value
//Extract an attribute value:
function getXMLAttribute(element,attname)
{
for (var k = 0; k < element["attributes"].length; k++)
{
var attr = element["attributes"][k];
for (property in attr)
{
if (property==attname)
return attr[property];
}
}
}
Comments
Post a Comment