0

I'm trying to parse XML to JSON in Nodejs, but I'm getting back some very weird JSON data.

This is the XML data:

<?xml version="1.0" encoding="UTF-8" ?>
<RESPONSE>
<SINGLE>
<KEY name="users"><MULTIPLE>
<SINGLE>
<KEY name="id"><VALUE>1</VALUE>
</KEY>
<KEY name="username"><VALUE>guest</VALUE>
</KEY>
<KEY name="firstname"><VALUE>Guest user</VALUE>
</KEY>
<KEY name="lastname"><VALUE> </VALUE>
</KEY>
<KEY name="fullname"><VALUE>Guest user  </VALUE>
</KEY>
<KEY name="email"><VALUE>root@localhost</VALUE>
</KEY>
<KEY name="address"><VALUE null="null"/>
</KEY>
<KEY name="phone1"><VALUE null="null"/>
</KEY>
<KEY name="phone2"><VALUE null="null"/>
</KEY>
<KEY name="icq"><VALUE null="null"/>
</KEY>
<KEY name="skype"><VALUE null="null"/>
</KEY>
<KEY name="yahoo"><VALUE null="null"/>
</KEY>
<KEY name="aim"><VALUE null="null"/>
</KEY>
<KEY name="msn"><VALUE null="null"/>
</KEY>
<KEY name="department"><VALUE></VALUE>
</KEY>
<KEY name="institution"><VALUE null="null"/>
</KEY>
<KEY name="idnumber"><VALUE null="null"/>
</KEY>

The last value, 'idnumber', is the value I have to retrieve from all the users.

This is the generated json:

{ RESPONSE:
   { SINGLE:
      [ { KEY:
           [ { '$': { name: 'users' },
               MULTIPLE:
                [ { SINGLE:
                     [ { KEY:
                          [ { '$': { name: 'id' }, VALUE: [ '1' ] },
                            { '$': { name: 'username' }, VALUE: [ 'guest' ] },
                            { '$': { name: 'firstname' }, VALUE: [ 'Guest user' ] },
                            { '$': { name: 'lastname' }, VALUE: [ ' ' ] },
                            { '$': { name: 'fullname' }, VALUE: [ 'Guest user  ' ] },
                            { '$': { name: 'email' }, VALUE: [ 'root@localhost' ] },
                            { '$': { name: 'address' },
                              VALUE: [ { '$': { null: 'null' } } ] },
                            { '$': { name: 'phone1' },
                              VALUE: [ { '$': { null: 'null' } } ] },
                            { '$': { name: 'phone2' },
                              VALUE: [ { '$': { null: 'null' } } ] },
                            { '$': { name: 'icq' }, VALUE: [ { '$': { null: 'null' } } ] },
                            { '$': { name: 'skype' }, VALUE: [ { '$': { null: 'null' } } ] },
                            { '$': { name: 'yahoo' }, VALUE: [ { '$': { null: 'null' } } ] },
                            { '$': { name: 'aim' }, VALUE: [ { '$': { null: 'null' } } ] },
                            { '$': { name: 'msn' }, VALUE: [ { '$': { null: 'null' } } ] },
                            { '$': { name: 'department' }, VALUE: [ '' ] },
                            { '$': { name: 'institution' },
                              VALUE: [ { '$': { null: 'null' } } ] },
                            { '$': { name: 'idnumber' },
                              VALUE: [ { '$': { null: 'null' } } ] },

Can anyone help me set up a loop to retrieve only the 'idnumbers'? Or a way to clean up the json, because this looks kind of wrong...

Thanks in advance!!

EDIT

The XML came from Moodle, but I found a way to retrieve json data instead of XML. So the parsing isn't necessary anymore!

Milan_w
  • 291
  • 2
  • 4
  • 17

1 Answers1

0

You can try this

const transform = require('camaro')

const xml = `your xml goes here`

const result = transform(xml, {
    id: '//KEY[@idnumber]'
})

console.log(JSON.stringify(result, null, 2))
Tuan Anh Tran
  • 6,807
  • 6
  • 37
  • 54
  • Thanks for the reply! But I got this data from Moodle and apparently there is a way to retrieve json data instead of XML. So I don't need to parse the XML anymore, but thanks!! – Milan_w Jun 26 '17 at 11:46