7
votes

I have this method where I receive an XML response from a remote server and I need to convert the XML to JSON so that Angular 2 can work with the data:

 private extractData(res: Response) {
    let xml = res["_body"]
    console.log(xml);
    var parser = require('xml2json');
    var json = parser.toJson(xml);
    return json
  }

I am trying to use this Node Module: https://www.npmjs.com/package/xml2json

Now this node module is written in javascript (NOT TypeScript) so I'm not sure if I can even use it in an Angular 2 app.

I am getting this compilation error:

ERROR in ./~/isemail/lib/index.js Module not found: Error: Can't resolve 'dns' in '/Users/user/ebayTool/node_modules/isemail/lib' @ ./~/isemail/lib/index.js 5:12-26 @ ./~/joi/lib/string.js @ ./~/joi/lib/index.js @ ./~/xml2json/lib/xml2json.js @ ./~/xml2json/lib/index.js @ ./~/xml2json/index.js @ ./src/app/hero.service.ts @ ./src/app/app.component.ts @ ./src/app/app.module.ts @ ./src/main.ts @ multi webpack-dev-server/client?http://localhost:4200/ ./src/main.ts webpack: Failed to compile.

So my question is how to convert XML to JSON in Angular 2 and how I can properly import xml2json Node Module to be used in my project?

3

3 Answers

9
votes

If you use angular-cli to bootstrap your application - it comes already with node module to convert xml.

https://github.com/Leonidas-from-XIV/node-xml2js

So you do not need to add extra modules for this. As it is classic commonJS module - you need use require to import it:

let parseString = require('xml2js').parseString;

So your code can looks like:

let parseString = require('xml2js').parseString;
let xml = "<root>Hello xml2js!</root>"

parseString(xml, function (err, result) {
  console.dir(result);
});

You will receive next output:

enter image description here

In any cases - if you even do not use angular-clior want to use your preffered module to parse xml - use require to load it.

2
votes
function parseXml(xmlStr) {
    var result;
    var parser = require('xml2js');
    parser.Parser().parseString(xmlStr, (e, r) => {result = r});
    return result;
}
1
votes

As xml2js uses sax as parser and is a native c module, I would recommend using txml. In your bundle it will only be 4kb and the api is very clean: txml.parse(xmlString)

Disclaimer I am the author of txml.