Leonidas-from-XIV / node-xml2js

XML to JavaScript object converter.
MIT License
4.84k stars 598 forks source link

Builder json to xml : how to merge sub level node ? #610

Closed julienloizelet closed 3 years ago

julienloizelet commented 3 years ago

Hi,

When I try this code :

const xml2js = require('xml2js');
const builder = new xml2js.Builder({
});
const sampleObject1 = {
    "Lines": [
      {
        "Line": {
          "bar": "bazline1",
          "Sublines" : [
            {"Subline": {"sublinecontent" :  1}},
            {"Subline": {"sublinecontent" :  2}},
          ]
        }
      },
      {
        "Line": {
          "bar": "bazline2",
        }
      },
      {
        "Line": {
          "bar": "bazline3",
        }
      }
    ]  
}    

console.log(`Sample : \n${builder.buildObject(sampleObject1)}\n`);

the output result is

Sample : 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Lines>
  <Line>
    <bar>bazline1</bar>
    <Sublines>
      <Subline>
        <sublinecontent>1</sublinecontent>
      </Subline>
    </Sublines>
    <Sublines>
      <Subline>
        <sublinecontent>2</sublinecontent>
      </Subline>
    </Sublines>
  </Line>
  <Line>
    <bar>bazline2</bar>
  </Line>
  <Line>
    <bar>bazline3</bar>
  </Line>
</Lines>

As you can see, there is only one node Lines which contains 3 children nodes Line : this is what I expected because Lines is an array of Line in the initial json.

BUT : there are multiple (2) nodes Sublines where I was expecting something like :

<Sublines>
      <Subline>
        <sublinecontent>1</sublinecontent>
      </Subline>
      <Subline>
        <sublinecontent>2</sublinecontent>
      </Subline>
</Sublines>

Indeed, Sublines is an array of Subline in the initial json : so I was expecting Subline nodes to be children of a unique Sublines node.

Well, is there a way to get the result I want ?

julienloizelet commented 3 years ago

I found a solution, so I will close this.

Using this code :

const xml2js = require('xml2js');
const builder = new xml2js.Builder({
});
const sampleObject1 = {
  "Lines": {
      "Line": [
          {
              "bar": [
                  "bazline1"
              ],
              "Sublines": 
                  {
                      "Subline": [
                          {
                              "sublinecontent": [
                                  "1"
                              ]
                          },
                          {
                              "sublinecontent": [
                                  "2"
                              ]
                          }
                      ]
                  }

          },
          {
              "bar": [
                  "bazline2"
              ]
          },
          {
              "bar": [
                  "bazline3"
              ]
          }
      ]
  }
}

console.log(`Sample : \n${builder.buildObject(sampleObject1)}\n`);

the output result is as expected :

Sample : 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Lines>
  <Line>
    <bar>bazline1</bar>
    <Sublines>
      <Subline>
        <sublinecontent>1</sublinecontent>
      </Subline>
      <Subline>
        <sublinecontent>2</sublinecontent>
      </Subline>
    </Sublines>
  </Line>
  <Line>
    <bar>bazline2</bar>
  </Line>
  <Line>
    <bar>bazline3</bar>
  </Line>
</Lines>