Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

js2xml outputs empty string #20

Closed
jncr opened this issue Jun 20, 2017 · 3 comments
Closed

js2xml outputs empty string #20

jncr opened this issue Jun 20, 2017 · 3 comments

Comments

@jncr
Copy link

jncr commented Jun 20, 2017

// test.js
const convert = require('xml-js');
const js = { request: { user: 'username', pass: 'password', numbers: { number: 1, number: 2 } } }
const xml = convert.js2xml(js);
console.log(xml);
> node test.js
''

node@8.1.2
xml-js@1.3.2

runkit here - https://runkit.com/jncr/xml-js. Something I'm doing wrong?

@nashwaan
Copy link
Owner

@jncr ,
First of all, your js object is illegal. The numbers object has two properties of same name, number.
Secondly, the js object is missing _text property.

The correct js object should be:

const js = {
    request: {
        user: {
            _text: 'username'
        },
        pass: {
            _text: 'password'
        },
        numbers: {
            number: [
                {
                    _text: 1
                },
                {
                    _text: 2
                }
            ]
        }
    }
};

Lastly, you need to pass compact: true option to tell the parser that the input is in compact form:

const xml = convert.js2xml(js, {compact: true});

However, your sample input is simpler and I like it. I will try to add support to this kind of input so the parser can accept the following (note the usage of array in number to work around javascript object restriction):

const js = {
  request: {
    user: 'username', 
    pass: 'password', 
      numbers: {
        number: [1, 2]
      }
    }
  }
}

@nashwaan
Copy link
Owner

nashwaan commented Jun 20, 2017

Sorry @jncr. Now I remember why I did not support this kind of input. Although input like

const js = {name: 'Yousuf'}

is simpler than:

const js = {name: {_text: 'Yousuf'}}

which both can be parsed into xml as:

<name>Yousuf</name>

But the problem occurs when there is some attributes with the node. Say we want the output xml to be:

<name title="Mr">Yousuf</name>

We cannot use your syntax to support this. But we can use this syntax to support this requirement:

const js = {name: {_attributes: {title: 'Mr'}, _text: 'Yousuf'}}

To further illustrate why _text is crucial, consider the following example:

const js = {name: {_attributes: {title: 'Mr'}, _text: 'Yousuf', rating: {_text: 'good'}}}

which will generate following xml:

<name title="Mr">
    Yousuf
    <rating>good</rating>
</name>

I don't think this can be represented by your js object syntax.

@nashwaan
Copy link
Owner

nashwaan commented Oct 3, 2017

@jncr
I have supported in v1.5.1 converting js object {a: 'hi'} (rather than {a: {_text: 'hi'}}) to <a>hi</a>.

See also release notes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants