xml-js, xmlbuilder, and xmlbuilder2 are essential tools for working with XML in JavaScript environments, but they solve different problems. xml-js focuses on converting XML data to JSON objects and vice versa, making it ideal for data interchange and configuration parsing. xmlbuilder and xmlbuilder2 are designed for programmatically generating XML documents from scratch using a chainable API. While xmlbuilder is the classic, stable implementation, xmlbuilder2 is its modern successor, offering improved performance, streaming support for large files, and better compliance with modern JavaScript standards.
Working with XML in JavaScript often falls into two distinct categories: converting existing XML data into usable objects (parsing) or creating new XML documents from scratch (generation). xml-js handles the former, while xmlbuilder and xmlbuilder2 handle the latter. Understanding these distinctions is critical for architectural decisions, as using a generator for parsing tasks (or vice versa) leads to unnecessary complexity.
xml-js is a utility for data transformation.
// xml-js: Convert XML string to JS object
const convert = require('xml-js');
const xml = '<note><to>Tove</to><from>Jani</from></note>';
const result = convert.xml2js(xml, { compact: true });
// Output: { note: { to: { _text: 'Tove' }, from: { _text: 'Jani' } } }
xmlbuilder is a tree builder for generation.
.end().// xmlbuilder: Create XML tree
const builder = require('xmlbuilder');
const root = builder.create('note')
.ele('to').txt('Tove').up()
.ele('from').txt('Jani').up();
const xml = root.end({ pretty: true });
xmlbuilder2 is the modern tree builder.
xmlbuilder but with streaming support.// xmlbuilder2: Create XML with streaming capability
const { create } = require('xmlbuilder2');
const root = create().ele('note');
root.ele('to').txt('Tove');
root.ele('from').txt('Jani');
const xml = root.end({ prettyPrint: true });
Memory management is the biggest differentiator between the classic and modern builders.
xml-js loads the entire XML string into memory to parse it.
// xml-js: Synchronous parsing (blocks event loop)
const result = convert.xml2js(largeXmlString);
xmlbuilder builds the full document in memory before outputting.
// xmlbuilder: In-memory construction
const doc = builder.create('root');
// ... add thousands of nodes ...
const output = doc.end(); // All in memory
xmlbuilder2 supports streaming output.
// xmlbuilder2: Stream to file
const { create } = require('xmlbuilder2');
const root = create().ele('root');
const writer = root.write({ prettyPrint: true });
writer.pipe(require('fs').createWriteStream('output.xml'));
The way you interact with these libraries affects code readability and maintenance.
xml-js uses a functional API.
// xml-js: Functional style
const json = convert.xml2js(xml, { compact: true, spaces: 2 });
const xmlBack = convert.js2xml(json, { compact: true, spaces: 2 });
xmlbuilder uses a chainable, mutable API.
.up() is required to move back to the parent node.// xmlbuilder: Chainable with .up()
builder.create('book')
.ele('title').txt('Design Patterns').up()
.ele('author').txt('Gang of Four').up();
xmlbuilder2 uses a refined chainable API.
xmlbuilder but more intuitive.// xmlbuilder2: Chainable with namespace support
const doc = create().ele('http://example.com/ns', 'book');
doc.att('id', '123').ele('title').txt('Modern XML');
You need to read a sitemap.xml to extract URLs for a crawler.
xml-js// xml-js: Parse sitemap
const sitemap = convert.xml2js(fs.readFileSync('sitemap.xml'));
const urls = sitemap.urlset.url.map(u => u.loc);
You need to construct a specific XML payload for a legacy enterprise API.
xmlbuilder2// xmlbuilder2: SOAP envelope
const root = create().ele('soap:Envelope').att('xmlns:soap', '...');
root.ele('soap:Body').ele('GetUser').ele('UserID').txt('101');
const payload = root.end();
You need to export millions of log entries into a single XML archive file.
xmlbuilder2 (Streaming)xmlbuilder would crash due to memory limits; xml-js is for parsing, not generation.// xmlbuilder2: Stream large data
const writer = create().ele('logs').write({ prettyPrint: false });
logs.forEach(log => writer.ele('entry').txt(log));
writer.end();
Your build tool reads a simple config.xml file to set environment variables.
xml-js// xml-js: Read config
const config = convert.xml2js(fs.readFileSync('config.xml'), { compact: true });
const env = config.config.environment._text;
| Feature | xml-js | xmlbuilder | xmlbuilder2 |
|---|---|---|---|
| Primary Use | XML β JSON Conversion | XML Generation | XML Generation |
| API Style | Functional | Chainable | Chainable |
| Memory Model | In-Memory (Buffer) | In-Memory (Buffer) | Streaming Supported |
| Dependencies | None | None | Minimal |
| Namespace Support | Basic | Yes | Advanced |
| Maintenance | Active | Stable (Legacy) | Active (Modern) |
Think in terms of data flow direction:
xml-js. It turns XML into plain JavaScript objects you can work with easily. It is lightweight and perfect for configuration or API data.xmlbuilder2. It is the modern standard for generation. It avoids the memory pitfalls of the original xmlbuilder and supports streaming, which is essential for scalability.xmlbuilder is still stable and works fine for small tasks, but plan to migrate to xmlbuilder2 for long-term health.Final Thought: Don't mix tools. Use xml-js for parsing data and xmlbuilder2 for creating documents. This separation keeps your architecture clean and performant.
Choose xml-js when your primary goal is data conversion between XML and JSON formats. It is the best fit for parsing API responses, reading configuration files, or transforming data structures without needing to manipulate the XML DOM directly. It is lightweight and has no dependencies, making it suitable for both Node.js and browser environments where bundle size matters.
Choose xmlbuilder if you are maintaining a legacy codebase that already depends on it or if you need a proven, stable library for generating small to medium-sized XML documents. It offers a simple, chainable API that is easy to learn. However, for new projects requiring high performance or streaming capabilities, you should evaluate xmlbuilder2 instead.
Choose xmlbuilder2 for new projects that require generating XML documents, especially if you are dealing with large datasets. It supports streaming, which prevents memory overload when creating massive files. Its API is similar to xmlbuilder but modernized, offering better error handling and alignment with current web standards. It is the recommended choice for forward-looking architectures.
Convert XML text to Javascript object / JSON text (and vice versa).
<a/><b/><a/> to {a:[{},{}],b:{}} which merges any node of same name into an array. This library can create the following to preserve the order of elements:
{"elements":[{"type":"element","name":"a"},{"type":"element","name":"b"},{"type":"element","name":"a"}]}.This is very important and it is the main reason why this library was created. Read also Compact vs Non-Compact for more info.
Fully XML Compliant: Can parse: elements, attributes, texts, comments, CData, DOCTYPE, XML declarations, and Processing Instructions.
Reversible: Whether converting xmlβjson or jsonβxml, the result can be converted back to its original form.
Minimal Dependencies: This library depends only on one external npm module.
Change Property Key Name:
Usually output of XML attributes are stored in @attr, _atrr, $attr or $ in order to avoid conflicting with name of sub-elements.
This library store them in attributes, but most importantly, you can change this to whatever you like.
Support Upwards Traversal:
By setting {addParent: true} option, an extra property named parent will be generated along each element so that its parent can be referenced.
Therefore, anywhere during the traversal of an element, its children and its parent can be easily accessed.
Support Command Line: To quickly convert xml or json files, this module can be installed globally or locally (i.e. use it as script in package.json).
Customize Processing using Callback Hooks: Custom functions can be supplied to do additional processing for different parts of xml or json (like cdata, comments, elements, attributes ...etc).
Portable Code: Written purely in JavaScript which means it can be used in Node environment and browser environment (via bundlers like browserify/JSPM/Webpack).
Typings Info Included: Support type checking and code suggestion via intellisense. Thanks to the wonderful efforts by DenisCarriere.
Most XML to JSON converters (including online converters) convert <a/> to some compact output like {"a":{}}
instead of non-compact output like {"elements":[{"type":"element","name":"a"}]}.
While compact output might work in most situations, there are cases when elements of different names are mixed inside a parent element. Lets use <a x="1"/><b x="2"/><a x="3"/> as an example.
Most converters will produce compact output like this {a:[{_:{x:"1"}},{_:{x:"3"}}], b:{_:{x:"2"}}},
which has merged both <a> elements into an array. If you try to convert this back to xml, you will get <a x="1"/><a x="3"/><b x="2"/>
which has not preserved the order of elements!
The reason behind this behavior is due to the inherent limitation in the compact representation.
Because output like {a:{_:{x:"1"}}, b:{_:{x:"2"}}, a:{_:{x:"3"}}} is illegal (same property name a should not appear twice in an object). This leaves no option but to use array {a:[{_:{x:"1"}},{_:{x:"3"}}].
The non-compact output, which is supported by this library, will produce more information and always guarantees the order of the elements as they appeared in the XML file.
Another drawback of compact output is the resultant element can be an object or an array and therefore makes the client code a little awkward in terms of the extra check needed on object type before processing.
NOTE: Although non-compact output is more accurate representation of original XML than compact version, the non-compact version is verbose and consumes more space.
This library provides both options. Use {compact: false} if you are not sure because it preserves everything;
otherwise use {compact: true} if you want to save space and you don't care about mixing elements of same name and losing their order.
Tip: You can reduce the output size by using shorter key names.
npm install --save xml-js
You can also install it globally to use it as a command line convertor (see Command Line).
npm install --global xml-js
var convert = require('xml-js');
var xml =
'<?xml version="1.0" encoding="utf-8"?>' +
'<note importance="high" logged="true">' +
' <title>Happy</title>' +
' <todo>Work</todo>' +
' <todo>Play</todo>' +
'</note>';
var result1 = convert.xml2json(xml, {compact: true, spaces: 4});
var result2 = convert.xml2json(xml, {compact: false, spaces: 4});
console.log(result1, '\n', result2);
To see the result of this code, see the output above in Synopsis section.
Or run and edit this code live in the browser.
| XML | JS/JSON compact | JS/JSON non-compact |
|---|---|---|
<a/> | {"a":{}} | {"elements":[{"type":"element","name":"a"}]} |
<a/><b/> | {"a":{},"b":{}} | {"elements":[{"type":"element","name":"a"},{"type":"element","name":"b"}]} |
<a><b/></a> | {"a":{"b":{}}} | {"elements":[{"type":"element","name":"a","elements":[{"type":"element","name":"b"}]}]} |
<a> Hi </a> | {"a":{"_text":" Hi "}} | {"elements":[{"type":"element","name":"a","elements":[{"type":"text","text":" Hi "}]}]} |
<a x="1.234" y="It's"/> | {"a":{"_attributes":{"x":"1.234","y":"It's"}}} | {"elements":[{"type":"element","name":"a","attributes":{"x":"1.234","y":"It's"}}]} |
<?xml?> | {"_declaration":{}} | {"declaration":{}} |
<?go there?> | {"_instruction":{"go":"there"}} | {"elements":[{"type":"instruction","name":"go","instruction":"there"}]} |
<?xml version="1.0" encoding="utf-8"?> | {"_declaration":{"_attributes":{"version":"1.0","encoding":"utf-8"}}} | {"declaration":{"attributes":{"version":"1.0","encoding":"utf-8"}}} |
<!--Hello, World!--> | {"_comment":"Hello, World!"} | {"elements":[{"type":"comment","comment":"Hello, World!"}]} |
<![CDATA[<foo></bar>]]> | {"_cdata":"<foo></bar>"} | {"elements":[{"type":"cdata","cdata":"<foo></bar>"}]} |
This library provides 4 functions: js2xml(), json2xml(), xml2js(), and xml2json(). Here are the usages for each one (see more details in the following sections):
var convert = require('xml-js');
result = convert.js2xml(js, options); // to convert javascript object to xml text
result = convert.json2xml(json, options); // to convert json text to xml text
result = convert.xml2js(xml, options); // to convert xml text to javascript object
result = convert.xml2json(xml, options); // to convert xml text to json text
To convert JavaScript object to XML text, use js2xml(). To convert JSON text to XML text, use json2xml().
var convert = require('xml-js');
var json = require('fs').readFileSync('test.json', 'utf8');
var options = {compact: true, ignoreComment: true, spaces: 4};
var result = convert.json2xml(json, options);
console.log(result);
The below options are applicable for both js2xml() and json2xml() functions.
| Option | Default | Description |
|---|---|---|
spaces | 0 | Number of spaces to be used for indenting XML output. Passing characters like ' ' or '\t' are also accepted. |
compact | false | Whether the input object is in compact form or not. By default, input is expected to be in non-compact form. |
IMPORTANT: Remeber to set this option compact: true if you are supplying normal json (which is likely equivalent to compact form). Otherwise, the function assumes your json input is non-compact form and you will not get a result if it is not in that form. See Synopsis to know the difference between the two json forms | ||
fullTagEmptyElement | false | Whether to produce element without sub-elements as full tag pairs <a></a> rather than self closing tag <a/>. |
indentCdata | false | Whether to write CData in a new line and indent it. Will generate <a>\n <![CDATA[foo]]></a> instead of <a><![CDATA[foo]]></a>. See discussion |
indentAttributes | false | Whether to print attributes across multiple lines and indent them (when spaces is not 0). See example. |
ignoreDeclaration | false | Whether to ignore writing declaration directives of xml. For example, <?xml?> will be ignored. |
ignoreInstruction | false | Whether to ignore writing processing instruction of xml. For example, <?go there?> will be ignored. |
ignoreAttributes | false | Whether to ignore writing attributes of the elements. For example, x="1" in <a x="1"></a> will be ignored |
ignoreComment | false | Whether to ignore writing comments of the elements. That is, no <!-- --> will be generated. |
ignoreCdata | false | Whether to ignore writing CData of the elements. That is, no <![CDATA[ ]]> will be generated. |
ignoreDoctype | false | Whether to ignore writing Doctype of the elements. That is, no <!DOCTYPE > will be generated. |
ignoreText | false | Whether to ignore writing texts of the elements. For example, hi text in <a>hi</a> will be ignored. |
To convert XML text to JavaScript object, use xml2js(). To convert XML text to JSON text, use xml2json().
var convert = require('xml-js');
var xml = require('fs').readFileSync('test.xml', 'utf8');
var options = {ignoreComment: true, alwaysChildren: true};
var result = convert.xml2js(xml, options); // or convert.xml2json(xml, options)
console.log(result);
The below options are applicable for both xml2js() and xml2json() functions.
| Option | Default | Description |
|---|---|---|
compact | false | Whether to produce detailed object or compact object. |
trim | false | Whether to trim whitespace characters that may exist before and after the text. |
sanitize (Deprecated) | false | Whether to replace & < > with & < > respectively, in the resultant text. |
nativeType | false | Whether to attempt converting text of numerals or of boolean values to native type. For example, "123" will be 123 and "true" will be true |
nativeTypeAttributes | false | Whether to attempt converting attributes of numerals or of boolean values to native type. See also nativeType above. |
addParent | false | Whether to add parent property in each element object that points to parent object. |
alwaysArray | false | Whether to always put sub element, even if it is one only, as an item inside an array. <a><b/></a> will be a:[{b:[{}]}] rather than a:{b:{}} (applicable for compact output only). If the passed value is an array, only elements with names in the passed array are always made arrays. |
alwaysChildren | false | Whether to always generate elements property even when there are no actual sub elements. <a></a> will be {"elements":[{"type":"element","name":"a","elements":[]}]} rather than {"elements":[{"type":"element","name":"a"}]} (applicable for non-compact output). |
instructionHasAttributes | false | Whether to parse contents of Processing Instruction as attributes or not. <?go to="there"?> will be {"_instruction":{"go":{"_attributes":{"to":"there"}}}} rather than {"_instruction":{"go":"to=\"there\""}}. See discussion. |
ignoreDeclaration | false | Whether to ignore parsing declaration property. That is, no declaration property will be generated. |
ignoreInstruction | false | Whether to ignore parsing processing instruction property. That is, no instruction property will be generated. |
ignoreAttributes | false | Whether to ignore parsing attributes of elements.That is, no attributes property will be generated. |
ignoreComment | false | Whether to ignore parsing comments of the elements. That is, no comment will be generated. |
ignoreCdata | false | Whether to ignore parsing CData of the elements. That is, no cdata will be generated. |
ignoreDoctype | false | Whether to ignore parsing Doctype of the elements. That is, no doctype will be generated. |
ignoreText | false | Whether to ignore parsing texts of the elements. That is, no text will be generated. |
The below option is applicable only for xml2json() function.
| Option | Default | Description |
|---|---|---|
spaces | 0 | Number of spaces to be used for indenting JSON output. Passing characters like ' ' or '\t' are also accepted. |
To change default key names in the output object or the default key names assumed in the input JavaScript object / JSON, use the following options:
| Option | Default | Description |
|---|---|---|
declarationKey | "declaration" or "_declaration" | Name of the property key which will be used for the declaration. For example, if declarationKey: '$declaration' then output of <?xml?> will be {"$declaration":{}} (in compact form) |
instructionKey | "instruction" or "_instruction" | Name of the property key which will be used for the processing instruction. For example, if instructionKey: '$instruction' then output of <?go there?> will be {"$instruction":{"go":"there"}} (in compact form) |
attributesKey | "attributes" or "_attributes" | Name of the property key which will be used for the attributes. For example, if attributesKey: '$attributes' then output of <a x="hello"/> will be {"a":{$attributes:{"x":"hello"}}} (in compact form) |
textKey | "text" or "_text" | Name of the property key which will be used for the text. For example, if textKey: '$text' then output of <a>hi</a> will be {"a":{"$text":"Hi"}} (in compact form) |
cdataKey | "cdata" or "_cdata" | Name of the property key which will be used for the cdata. For example, if cdataKey: '$cdata' then output of <![CDATA[1 is < 2]]> will be {"$cdata":"1 is < 2"} (in compact form) |
doctypeKey | "doctype" or "_doctype" | Name of the property key which will be used for the doctype. For example, if doctypeKey: '$doctype' then output of <!DOCTYPE foo> will be {"$doctype":" foo} (in compact form) |
commentKey | "comment" or "_comment" | Name of the property key which will be used for the comment. For example, if commentKey: '$comment' then output of <!--note--> will be {"$comment":"note"} (in compact form) |
parentKey | "parent" or "_parent" | Name of the property key which will be used for the parent. For example, if parentKey: '$parent' then output of <a></b></a> will be {"a":{"b":{$parent:_points_to_a}}} (in compact form) |
typeKey | "type" | Name of the property key which will be used for the type. For example, if typeKey: '$type' then output of <a></a> will be {"elements":[{"$type":"element","name":"a"}]} (in non-compact form) |
nameKey | "name" | Name of the property key which will be used for the name. For example, if nameKey: '$name' then output of <a></a> will be {"elements":[{"type":"element","$name":"a"}]} (in non-compact form) |
elementsKey | "elements" | Name of the property key which will be used for the elements. For example, if elementsKey: '$elements' then output of <a></a> will be {"$elements":[{"type":"element","name":"a"}]} (in non-compact form) |
Two default values mean the first is used for non-compact output and the second is for compact output.
TIP: In compact mode, you can further reduce output result by using fewer characters for key names
{textKey: '_', attributesKey: '$', commentKey: 'value'}. This is also applicable to non-compact mode.
TIP: In non-compact mode, you probably want to set
{textKey: 'value', cdataKey: 'value', commentKey: 'value'}to make it more consistent and easier for your client code to go through the contents of text, cdata, and comment.
For XML β JS object / JSON, following custom callback functions can be supplied:
var convert = require('xml-js');
var xml = '<foo:Name>Ali</Name> <bar:Age>30</bar:Age>';
var options = {compact: true, elementNameFn: function(val) {return val.replace('foo:','').toUpperCase();}};
var result = convert.xml2json(xml, options);
console.log(result); // {"NAME":{"_text":"Ali"},"BAR:AGE":{"_text":"30"}}
| Option | Signature | Description |
|---|---|---|
doctypeFn | (value, parentElement) | To perform additional processing for DOCTYPE. For example, {doctypeFn: function(val) {return val.toUpperCase();}} |
instructionFn | (instructionValue, instructionName, parentElement) | To perform additional processing for content of Processing Instruction value. For example, {instructionFn: function(val) {return val.toUpperCase();}}. Note: instructionValue will be an object if instructionHasAttributes is enabled. |
cdataFn | (value, parentElement) | To perform additional processing for CData. For example, {cdataFn: function(val) {return val.toUpperCase();}}. |
commentFn | (value, parentElement) | To perform additional processing for comments. For example, {commentFn: function(val) {return val.toUpperCase();}}. |
textFn | (value, parentElement) | To perform additional processing for texts inside elements. For example, {textFn: function(val) {return val.toUpperCase();}}. |
instructionNameFn | (instructionName, instructionValue, parentElement) | To perform additional processing for Processing Instruction name. For example, {instructionNameFn: function(val) {return val.toUpperCase();}}. Note: instructionValue will be an object if instructionHasAttributes is enabled. |
elementNameFn | (value, parentElement) | To perform additional processing for element name. For example, {elementNameFn: function(val) {return val.toUpperCase();}}. |
attributeNameFn | (attributeName, attributeValue, parentElement) | To perform additional processing for attribute name. For example, {attributeNameFn: function(val) {return val.toUpperCase();}}. |
attributeValueFn | (attributeValue, attributeName, parentElement) | To perform additional processing for attributeValue. For example, {attributeValueFn: function(val) {return val.toUpperCase();}}. |
attributesFn | (value, parentElement) | To perform additional processing for attributes object. For example, {attributesFn: function(val) {return val.toUpperCase();}}. |
For JS object / JSON β XML, following custom callback functions can be supplied:
var convert = require('xml-js');
var json = '{"name":{"_text":"Ali"},"age":{"_text":"30"}}';
var options = {compact: true, textFn: function(val, elementName) {return elementName === 'age'? val + '';}};
var result = convert.json2xml(json, options);
console.log(result); // <foo:Name>Ali</Name> <bar:Age>30</bar:Age>
| Option | Signature | Description |
|---|---|---|
doctypeFn | (value, currentElementName, currentElementObj) | To perform additional processing for DOCTYPE. For example, {doctypeFn: function(val) {return val.toUpperCase();}. |
instructionFn | (instructionValue, instructionName, currentElementName, currentElementObj) | To perform additional processing for content of Processing Instruction value. For example, {instructionFn: function(val) {return val.toUpperCase();}}. Note: instructionValue will be an object if instructionHasAttributes is enabled. |
cdataFn | (value, currentElementName, currentElementObj) | To perform additional processing for CData. For example, {cdataFn: function(val) {return val.toUpperCase();}}. |
commentFn | (value, currentElementName, currentElementObj) | To perform additional processing for comments. For example, {commentFn: function(val) {return val.toUpperCase();}}. |
textFn | (value, currentElementName, currentElementObj) | To perform additional processing for texts inside elements. For example, {textFn: function(val) {return val.toUpperCase();}}. |
instructionNameFn | (instructionName, instructionValue, currentElementName, currentElementObj) | To perform additional processing for Processing Instruction name. For example, {instructionNameFn: function(val) {return val.toUpperCase();}}. Note: instructionValue will be an object if instructionHasAttributes is enabled. |
elementNameFn | (value, currentElementName, currentElementObj) | To perform additional processing for element name. For example, {elementNameFn: function(val) {return val.toUpperCase();}}. |
attributeNameFn | (attributeName, attributeValue, currentElementName, currentElementObj) | To perform additional processing for attribute name. For example, {attributeNameFn: function(val) {return val.toUpperCase();}}. |
attributeValueFn | (attributeValue, attributeName, currentElementName, currentElementObj) | To perform additional processing for attributeValue. For example, {attributeValueFn: function(val) {return val.toUpperCase();}}. |
attributesFn | (value, currentElementName, currentElementObj) | To perform additional processing for attributes object. For example, {attributesFn: function(val) {return val.toUpperCase();}}. |
fullTagEmptyElementFn | (currentElementName, currentElementObj) | Whether to generate full tag or just self closing tag for elements that has no sub elements. For example, {fullTagEmptyElementFn: function(val) {return val === 'foo'}}. |
Because any good library should support command line usage, this library is no different.
npm install -g xml-js // install this library globally
xml-js test.json --spaces 4 // xml result will be printed on screen
xml-js test.json --spaces 4 --out test.xml // xml result will be saved to test.xml
xml-js test.xml --spaces 4 // json result will be printed on screen
xml-js test.xml --spaces 4 --out test.json // json result will be saved to test.json
If you want to use it as script in package.json (can also be helpful in task automation via npm scripts)
npm install --save xml-js // no need to install this library globally
In package.json, write a script:
...
"dependencies": {
"xml-js": "latest"
},
"scripts": {
"convert": "xml-js test.json --spaces 4"
}
Now in the command line, you can run this script by typing:
npm run convert // task 'scripts.convert' will be executed
Usage: xml-js src [options]
src Input file that need to be converted.
Conversion type xml->json or json->xml will be inferred from file extension.
Options:
--help, -h Display this help content.
--version, -v Display version number of this module.
--out Output file where result should be written.
--spaces Specifies amount of space indentation in the output.
--full-tag XML elements will always be in <a></a> form.
--no-decl Declaration directive <?xml?> will be ignored.
--no-inst Processing instruction <?...?> will be ignored.
--no-attr Attributes of elements will be ignored.
--no-text Texts of elements will be ignored.
--no-cdata CData of elements will be ignored.
--no-doctype DOCTYPE of elements will be ignored.
--no-comment Comments of elements will be ignored.
--trim Any whitespaces surrounding texts will be trimmed.
--compact JSON is in compact form.
--native-type Numbers and boolean will be converted (coerced) to native type instead of text.
--always-array Every element will always be an array type (applicable if --compact is set).
--always-children Every element will always contain sub-elements (applicable if --compact is not set).
--text-key To change the default 'text' key.
--cdata-key To change the default 'cdata' key.
--doctype-key To change the default 'doctype' key.
--comment-key To change the default 'comment' key.
--attributes-key To change the default 'attributes' key.
--declaration-key To change the default 'declaration' key.
--instruction-key To change the default 'processing instruction' key.
--type-key To change the default 'type' key (applicable if --compact is not set).
--name-key To change the default 'name' key (applicable if --compact is not set).
--elements-key To change the default 'elements' key (applicable if --compact is not set).
To perform tests on this project, download the full repository from GitHub (not from npm) and then do the following:
cd xml-js
npm install
npm test
For live testing, use npm start instead of npm test.
Use this link to report an issue or bug. Please include a sample code where the code is failing.