Novices Performing Miracles

    xmldeserializer

    0.5.0 • Public • Published

    NodeXmlDeserializer

    NOTE: The NPM package for this project is called XmlDeserializer.

    Description: A simple and somewhat crude XML de-serializer package for Node.

    shut up and show me the code!

        var xml = "<root>";
        xml += "<childelement someProp=\"somevalue\">";
        xml += "contents of child element";
        xml += "</childelement>";
        xml += "</root>";
     
        var ds = require("xmldeserializer");
        var elements = ds.deserialize(xml);
        var jsonString = ds.getJson(elements);
        console.log(jsonString);

    Output:

    {
      "root":{
        "properties" : {},
        "childelement":{
            properties : { "someProp":"somevalue" },
            "value":"contents of child element"}
        }
    }

    Example showing an array and other edge cases.

        var xml = "<Root>";
        xml += "<ListOfItems ItemCategory=\"blue\">";
        xml += "<Item>lagoon</Item>";
        xml += "<Item>man group</Item>";
        xml += "<Item>christmas</Item>";
        xml += "<Item>light special</Item>";
        xml += "</ListOfItems>";
        xml += "<EmptyXmlNode foo=\"bar\" />";
        xml += "<XmlNodeWithEmptyValue></XmlNodeWithEmptyValue>";
        xml += "</Root>";
     
        var ds = require("xmldeserializer");
        var elements = ds.deserialize(xml);
        var jsonString = ds.getJson(elements);
        console.log(jsonString);

    Output:

    • Notice that the array is wrapped in its own hash named "arrayOfX", where X is the name of the XML node.
    • Also, to accomodate properties, each array item is its own hash.
    • Last, notice that "EmtpyXmlNode is self-closing. Be definition its value is null.
    • However if a node has a separate closing tag, but no value, then the value in the json will be an empty string.
    {
      "root":{
        "properties" : {},
        "listOfItems":{
            "properties" : { "itemCategory":"blue" },
            "arrayOfItem" : [
                { "properties": {},
                  "value": "lagoon"
                },
                { "properties": {},
                  "value": "man group"
                },
                { "properties": {},
                  "value": "christmas"
                },
                { "properties": {},
                  "value": "light special"
                }
            ]
        },
        "emptyXmlNode" : {
            "properties" : { "foo":"bar" },
            "value": null
        },
        "xmlNodeWithEmptyValue" : {
            "properties": {},
            "value": ""
        }
      }
    }

    More examples in the app.js test file.

    Features:

    • No schema or object definitions! Just send it XML and out comes JSON!
    • Supports parsing of namespaces. You can (optionally) add the namespace or namespace abbreviation to the contents of the subsequent hash.
    • Supports CDATA, including special characters (newlines, etc).
    • Auto detects multiple element names and creates an array, or you can specify the node name to always be interpreted as an array.

    Limitations:

    • No support for streams. You must pass in the entire XML block in a string.
    • XML properties must have values enclosed in quotes. e.g. (This means numeric and boolean property values aren't currently supported.)
    • The getJson method currently doesn't take namespaces into consideration. If your xml schema has duplicate names in different namespaces this may be an issue for you.
    • Only supports the 5 standard entities (quot, amp, apos, lt, gt). No support for custom defined entities... it will probably cause the parser to blow up.

    Using xml deserializer with Express:

    var express = require("express");
    var app = express();
     
    // This will put the deserialized data into req.body for your route handlers to access.
    app.use(function(req, res, next) {
        if (req.headers["content-type"] == "application/xml") {
            req.rawBody = "";
            req.setEncoding("utf8");
            req.on('data', function(chunk) { 
                req.rawBody += chunk;
            });
            req.on('end', function() {
                var elements = xmldeserializer.deserialize(req.rawBody);
                req.body = JSON.parse(xmldeserializer.getJson(elements));
                next();
            });
        }
        else {
            next();
        }
    });
     

    Keywords

    none

    Install

    npm i xmldeserializer

    DownloadsWeekly Downloads

    58

    Version

    0.5.0

    License

    none

    Last publish

    Collaborators

    • ctigeek