Validate XML, Parse XML to JS/JSON and vice versa, or parse XML to Nimn rapidly without C/C++ based libraries and no callback
To cover expenses, we're planning to launch FXP Enterprise edition in parallel. Watch it for further updates, if you're interested.

Check ThankYouBackers for our contributors
List of some applications/projects using Fast XML Parser. (Raise an issue to submit yours)
The list of users is collected either from the list published by Github, cummunicated directly through mails/chat , or from other resources. If you feel that your name in the above list is incorrectly published or you're not the user of this library anymore then you can inform us to remove it. We'll do the necessary changes ASAP.
To use it as an NPM package:
npm install fast-xml-parser
Or using yarn:
yarn add fast-xml-parser
To use it from a CLI install it globally with the -g option.
npm install fast-xml-parser -g
To use it on a webpage include it from a CDN
const jsonObj = parser.parse(xmlData [,options] );
const parser = require('fast-xml-parser'); const he = require('he'); const options = { attributeNamePrefix : "@_", attrNodeName: "attr", //default is 'false' textNodeName : "#text", ignoreAttributes : true, ignoreNameSpace : false, allowBooleanAttributes : false, parseNodeValue : true, parseAttributeValue : false, trimValues: true, cdataTagName: "__cdata", //default is 'false' cdataPositionChar: "\\c", parseTrueNumberOnly: false, numParseOptions:{ hex: true, leadingZeros: true, //skipLike: /\+[0-9]{10}/ }, arrayMode: false, //"strict" attrValueProcessor: (val, attrName) => he.decode(val, {isAttributeValue: true}),//default is a=>a tagValueProcessor : (val, tagName) => he.decode(val), //default is a=>a stopNodes: ["parse-me-as-string"], alwaysCreateTextNode: false }; if( parser.validate(xmlData) === true) { //optional (it'll return an object in case it's not valid) let jsonObj = parser.parse(xmlData,options); } // Intermediate obj const tObj = parser.getTraversalObj(xmlData,options); let jsonObj = parser.convertToJson(tObj,options);
As you can notice in the above code, validator is not embedded with in the parser and expected to be called separately. However, you can pass true or validation options as 3rd parameter to the parser to trigger validator internally. It is same as above example.
try{ let jsonObj = parser.parse(xmlData,options, true); }catch(error){ console.log(error.message) }
Validator returns the following object in case of error;
{ err: { code: code, msg: message, line: lineNumber, }, };
false, a tag with single occurrence is parsed as an object but as an array in case of multiple occurences. When true, a tag will be parsed as an array always excluding leaf nodes. When strict, all the tags will be parsed as array only. When instance of RegEx, only tags will be parsed as array that match the regex. When function a tag name is passed to the callback that can be checked.true, forces the parser always return a property for the textNodeName even if there are no attributes or node children.$xml2js [-ns|-a|-c|-v|-V] <filename> [-o outputfile.json] $cat xmlfile.xml | xml2js [-ns|-a|-c|-v|-V] [-o outputfile.json]
const result = parser.validate(xmlData); if (result !== true) console.log(result.err); const jsonObj = parser.parse(xmlData);
const Parser = require("fast-xml-parser").j2xParser; //default options need not to set const defaultOptions = { attributeNamePrefix : "@_", attrNodeName: "@", //default is false textNodeName : "#text", ignoreAttributes : true, cdataTagName: "__cdata", //default is false cdataPositionChar: "\\c", format: false, indentBy: " ", supressEmptyNode: false, tagValueProcessor: a=> he.encode(a, { useNamedReferences: true}),// default is a=>a attrValueProcessor: a=> he.encode(a, {isAttributeValue: isAttribute, useNamedReferences: true}),// default is a=>a rootNodeName: "element" }; const parser = new Parser(defaultOptions); const xml = parser.parse(json_or_js_obj);
With the correct options, you can get the almost original XML without losing any information.
when format is set to truetrue, tags with no value (text or nested tags) are written as self closing tags.
| file size | fxp 3.0 validator (rps) | fxp 3.0 parser (rps) | xml2js 0.4.19 (rps) |
|---|---|---|---|
| 1.5k | 16581.06758 | 14032.09323 | 4615.930805 |
| 1.5m | 14918.47793 | 13.23366098 | 5.90682005 |
| 13m | 1.834479235 | 1.135582008 | -1 |
| 1.3k with CDATA | 30583.35319 | 43160.52342 | 8398.556349 |
| 1.3m with CDATA | 27.29266471 | 52.68877009 | 7.966000795 |
| 1.6k with cdata,prolog,doctype | 27690.26082 | 41433.98547 | 7872.399268 |
| 98m | 0.08473858148 | 0.2600104004 | -1 |

| file size | fxp 3.2 js to xml | xml2js 0.4.19 builder |
|---|---|---|
| 1.3k | 160148.9801 | 10384.99401 |
| 1.1m | 173.6374831 | 8.611884025 |
This project exists thanks to all the people who contribute. [Contribute].
Thank you to all our backers! 🙏 [Become a backer]
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]