XML

The Cloud CMS Bulk Import tool makes it easy to import content from an XML file into a Cloud CMS content repository. XML is a common format for content that has been exported from an existing database or legacy CMS system.

Suppose you have an XML data set containing information about soccer leagues around the world. It might look something like this:

<?xml version='1.0' encoding='utf-8'?>
<root>
    <leagues>
        <league code="bol" name="Nacional" country="Bolivia"/>
        <league code="eng" name="Barclays Premier League" country="England"/>
        <league code="usa" name="MLS" country="USA"/>
    </leagues>
</root>

The snippet above is truncated to just show three leagues (for brevity) and is by no means a mindfully curated list. The actual list would have many more entries but, for now, these will do.

Suppose this XML file is located at data/soccer-leagues.xml.

We might also define a my:league content type definition that looks like this:

{
    "title": "League",
    "type": "object",
    "properties": {
        "title": {
            "title": "Title",
            "type": "string"
        },
        "code": {
            "title": "Code",
            "type": "string"
        },
        "country": {
            "title": "Country",
            "type": "string"
        }
    },
    "_qname": "my:league",
    "_type": "d:type",
    "_parent": "n:node"
}

This content type definition could be located at types/my_league/node.json.

We can import this content into Cloud CMS by using the cloudcms-packager module like this:

var fs = require("fs");
var parseString = require("xml2js").parseString;

// create a packager
var PackagerFactory = require("cloudcms-packager");
PackagerFactory.create(function(err, packager) {

    // package up the "my:league" content type definition
    packager.addFromDisk("./types/my_league/node.json");

    // parse XML and create content instances
    var xmlText = fs.readFileSync("./data/soccer-leagues.xml").toString();
    parseString(xmlText, function (err, result) {

        var array = result.root.leagues[0].league;
        for (var i = 0; i < array.length; i++)
        {
            var entry = JSON.parse(JSON.stringify(array[i]["$"]));
            entry._type = "my:league";
            entry.title = entry.name;
            delete entry.name;

            packager.addNode(entry);
        }

        // commit
        packager.package(function(err, archiveInfo) {
            console.log("Wrote archive: " + archiveInfo.filename);
        });
    });
});

For a full example of this code in action, please see:

https://github.com/gitana/cloudcms-packager/tree/master/examples/xml/soccer-leagues/example1