解析js对象中的数组对象到xml不起作用

问题描述 投票:0回答:5

嘿,我正在尝试在 node.js 应用程序中将 javascript 对象解析为 xml 字符串。我正在使用 npm 包

json2xml
像这样

json2xml(jsonObject, { header: true });

我的问题是,当有一个数组对象时,它会像这样解析它:

root: {
    foo: [
        {
            bar: 'a',
        },
        {
            bar: 'b',
        },
    ],
};
<root>
    <foo>
        <bar>a</bar>
        <bar>a</bar>
    </foo>

而不是这样:

<root>
    <foo>
        <bar>a</bar>
    </foo>
    <foo>
        <bar>b</bar>
    </foo>
</root>

如我所愿。您有任何建议或任何其他我可以用来解决此问题的库吗?

我尝试了其他几个库:

jstoxml
@javadev/xmltojson
fast-xml-parser
,但都没有解决问题。我正在考虑编写自己的 jsToXml 解析器 xD

javascript node.js typescript xml xml-parsing
5个回答
2
投票

该对象应该这样组成:

{root: [{foo: {bar: "a"}}, {foo: {bar: "b"}}]}

0
投票

好吧,假设我有一个像这样更复杂的对象:

{
  root: {
    method: "ping",
    success: 1,
    error_code: 0,
    error_text: null,
    params: {
      foo: 11,
      bar: [
        {
          id: 62278639526,
          success: 1,
          error_code: 0
        },
        {
          id: 96176048010,
          success: 1,
          error_code: 0
        }
      ]
    },
    response_id: "b33ba904",
    time: 1681373894,
  }
}

我还没有找到如何将js对象转换为xml的方法:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <method>ping</method>
   <success>1</success>
   <error_code>0</error_code>
   <error_text />
   <params>
      <foo>11</foo>
      <bar>
         <id>62278639526</id>
         <success>1</success>
         <error_code>0</error_code>
      </bar>
      <bar>
         <id>96176048010</id>
         <success>1</success>
         <error_code>0</error_code>
      </bar>
   </params>
   <response_id>b33ba904</response_id>
   <time>1681373894</time>
</root>

相反,我总是得到这个:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <method>ping</method>
   <success>1</success>
   <error_code>0</error_code>
   <error_text />
   <params>
      <foo>11</foo>
      <bar>
         <id>62278639526</id>
         <success>1</success>
         <error_code>0</error_code>
         <id>96176048010</id>
         <success>1</success>
         <error_code>0</error_code>
      </bar>
   </params>
   <response_id>b33ba904</response_id>
   <time>1681373894</time>
</root>

0
投票

完全不是一回事,那我就这个:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <method>ping</method>
    <success>1</success>
    <error_code>0</error_code>
    <error_text />
    <params>
        <foo>11</foo>
        <bar>
            <bar>
                <id>62278639526</id>
                <success>1</success>
                <error_code>0</error_code>
            </bar>
            <bar>
                <id>96176048010</id>
                <success>1</success>
                <error_code>0</error_code>
            </bar>
        </bar>
    </params>
    <response_id>b33ba904</response_id>
    <time>1681373894</time>
</root>

所以我不确定这个库是否可以实现我想要的。我只是想确定是否有任何解决方案。如果没有也没关系,我可以找到其他方法。


0
投票

不可能根据需要转换你的更复杂的示例,除非你在'params'中添加一个键,但这不是同一件事:

{
   "root":{
      "method":"ping",
      "success":1,
      "error_code":0,
      "error_text":null,
      "params":{
         "foo":11,
         "bar":[
            {
               "bar":{
                  "id":62278639526,
                  "success":1,
                  "error_code":0
               }
            },
            {
               "bar":{
                  "id":96176048010,
                  "success":1,
                  "error_code":0
               }
            }
         ]
      },
      "response_id":"b33ba904",
      "time":1681373894
   }
}

0
投票

我需要在 XMLBuilder 中将 oneListGroup 作为 true 传递

const builder = new XMLBuilder({
  format: true,
  oneListGroup: true
});
© www.soinside.com 2019 - 2024. All rights reserved.