Fast and simple Javascript-based XML generator/builder for Node projects.
$ npm install xml
Returns a XML string.
varxml=require('xml');varxmlString=xml(xmlObject,options);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>'indentoptionalstring 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
varelem=xml.element({_attr: {decade: '80s',locale: 'US'}});varstream=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>*/Declarationoptional Add default xml declaration as first node.
options are:
- encoding: 'value'
- standalone: 'value'
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
varexample1=[{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
varexample2=[{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
varexample3=[{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
varexample4=[{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
varexample5=[{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.
