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

Parsing array objects in js objects to xml not working

提问人:Jakub Vala 提问时间:4/13/2023 更新时间:11/13/2023 访问量:186

问:

嘿,我正在尝试将javascript对象解析为node.js应用程序中的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解析器xDjstoxml@javadev/xmltojsonfast-xml-parser

JavaScript 节点 .js 打字稿 XML XML 解析

评论

0赞 kjhughes 4/13/2023
它运行良好。所需输出的结构与提供的 JSON 的结构根本不匹配。请参阅@Pippo的答案 (+1),了解与您的目标 XML 匹配的 JSON。

答:

2赞 Pippo 4/13/2023 #1

对象应按如下方式组成:

{root: [{foo: {bar: "a"}}, {foo: {bar: "b"}}]}
0赞 Jakub Vala 4/13/2023 #2

好的,假设我有一个更复杂的对象,如下所示:

{
  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赞 Pippo 4/13/2023 #3

除非您在“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赞 Jakub Vala 4/13/2023 #4

确切地说,这不是一回事,那么我就有这个:

<?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赞 lesimoes 11/13/2023 #5

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

const builder = new XMLBuilder({
  format: true,
  oneListGroup: true
});