Fast and simple Javascript-based XML generator/builder for Node projects.
$ npm install xml
xml(xmlObject, options)
Returns a XML
string.
var xml = require('xml'); var xmlString = xml(xmlObject, options);
xmlObject
xmlObject
is a normal JavaScript Object/JSON object that defines the data for the XML string.
Keys will become tag names. Values can be an array of xmlObjects
or a value such as a string
or number
.
xml({a: 1}) === '<a>1</a>' xml({nested: [{ keys: [{ fun: 'hi' }]}]}) === '<nested><keys><fun>hi</fun></keys></nested>'
There are two special keys:
_attr
Set attributes using a hash of key/value pairs.
xml({a: [{ _attr: { attributes: 'are fun', too: '!' }}, 1]}) === '<a attributes="are fun" too="!">1</a>'
_cdata
Value of _cdata
is wrapped in xml ![CDATA[]]
so the data does not need to be escaped.
xml({a: { _cdata: "i'm not escaped: <xml>!"}}) === '<a><![CDATA[i\'m not escaped: <xml>!]]></a>'
Mixed together:
xml({a: { _attr: { attr:'hi'}, _cdata: "I'm not escaped" }}) === '<a attr="hi"><![CDATA[I\'m not escaped]]></a>'
options
indent
optional string What to use as a tab. Defaults to no tabs (compressed). For example you can use '\t'
for tab character, or ' '
for two-space tabs.
stream
Return the result as a stream
.
Stream Example
var elem = xml.element({ _attr: { decade: '80s', locale: 'US'} }); var stream = xml({ toys: elem }, { stream: true }); stream.on('data', function (chunk) {console.log("data:", chunk)}); elem.push({ toy: 'Transformers' }); elem.push({ toy: 'GI Joe' }); elem.push({ toy: [{name:'He-man'}] }); elem.close(); /* result: data: <toys decade="80s" locale="US"> data: <toy>Transformers</toy> data: <toy>GI Joe</toy> data: <toy> <name>He-man</name> </toy> data: </toys> */
Declaration
optional Add default xml declaration as first node.
options are:
Declaration Example
xml([ { a: 'test' }], { declaration: true }) //result: '<?xml version="1.0" encoding="UTF-8"?><a>test</a>' xml([ { a: 'test' }], { declaration: { standalone: 'yes', encoding: 'UTF-16' }}) //result: '<?xml version="1.0" encoding="UTF-16" standalone="yes"?><a>test</a>'
Simple Example
var example1 = [ { url: 'http://www.google.com/search?aq=f&sourceid=chrome&ie=UTF-8&q=opower' } ]; console.log(XML(example1)); //<url>http://www.google.com/search?aq=f&sourceid=chrome&ie=UTF-8&q=opower</url>
Example with attributes
var example2 = [ { url: { _attr: { hostname: 'www.google.com', path: '/search?aq=f&sourceid=chrome&ie=UTF-8&q=opower' } } } ]; console.log(XML(example2)); //result: <url hostname="www.google.com" path="/search?aq=f&sourceid=chrome&ie=UTF-8&q=opower"/>
Example with array of same-named elements and nice formatting
var example3 = [ { toys: [ { toy: 'Transformers' } , { toy: 'GI Joe' }, { toy: 'He-man' } ] } ]; console.log(XML(example3)); //result: <toys><toy>Transformers</toy><toy>GI Joe</toy><toy>He-man</toy></toys> console.log(XML(example3, true)); /* result: <toys> <toy>Transformers</toy> <toy>GI Joe</toy> <toy>He-man</toy> </toys> */
More complex example
var example4 = [ { toys: [ { _attr: { decade: '80s', locale: 'US'} }, { toy: 'Transformers' } , { toy: 'GI Joe' }, { toy: 'He-man' } ] } ]; console.log(XML(example4, true)); /* result: <toys decade="80s" locale="US"> <toy>Transformers</toy> <toy>GI Joe</toy> <toy>He-man</toy> </toys> */
Even more complex example
var example5 = [ { toys: [ { _attr: { decade: '80s', locale: 'US'} }, { toy: 'Transformers' } , { toy: [ { _attr: { knowing: 'half the battle' } }, 'GI Joe'] }, { toy: [ { name: 'He-man' }, { description: { _cdata: '<strong>Master of the Universe!</strong>'} } ] } ] } ]; console.log(XML(example5, true)); /* result: <toys decade="80s" locale="US"> <toy>Transformers</toy> <toy knowing="half the battle"> GI Joe </toy> <toy> <name>He-man</name> <description><![CDATA[<strong>Master of the Universe!</strong>]]></description> </toy> </toys> */
Tests included use AVA. Use npm test
to run the tests.
$ npm test
There are examples in the examples directory.
Contributions to the project are welcome. Feel free to fork and improve. I accept pull requests when tests are included.