Generating XML from JavaScript


Generating XML from JavaScript:

When to use these functions:


In some Javascript-based environments there are no XML libraries available, sometimes external libraries are not allowed or you just want fine control over your xml generation process. They are easy to implement and easy to use too.

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

Popular posts from this blog

Qt Signals and Slots, Connecting and Disconnecting

Vaadin 7: Detect Enter Key in a TextField

JAVA JPA WITH HIBERNATE AND H2 Tutorial