【问题标题】:Mule 4: Transforming SQL XML object to JSONMule 4:将 SQL XML 对象转换为 JSON
【发布时间】:2020-08-06 14:10:49
【问题描述】:

我将 SQLXML 结果集作为从数据库执行存储过程形状调用的 MS SQL 存储过程的输出。

SQLXML 结果集如下所示:

<xmlcontent>
   <field1>val1</field1>
   <field2>val2</field2>
   <field3>val3</filed3>
</xmlcontent>
<xmlcontent>
   <field1>val1</field1>
   <field2>val2</field2>
   <field3>val3</filed3>
</xmlcontent>
<xmlcontent>
   <field1>val1</field1>
   <field2>val2</field2>
   <field3>val3</filed3>
</xmlcontent>

但是,有效负载有点奇怪,因为它包含长度为 2033 的 XML 输出,然后作为数组元素重复,直到有效负载耗尽。仅有效载荷的变换形状输出显示:

{
  "resultSet1": [
    {
      "XML_F52E2B61-18A1-11d1-B105-00805F49916B": "<xmlcontent><field1/><field2/><field3/>" --this content is of size 2033 max
    },
    {
      "XML_F52E2B61-18A1-11d1-B105-00805F49916B": "</xmlcontent><xmlcontent><field1/><fiel" --this content is of size 2033 max
    },
    {
      "XML_F52E2B61-18A1-11d1-B105-00805F49916B": "d2/><field3/><xmlcontent>"
    }
  ]
}

我正在考虑使用另一种转换形状从结果集 1 数组中附加“XML_F52E2B61-18A1-11d1-B105-00805F49916B”的值,然后转换为 JSON。数据编织中有没有一种方法可以简化这种方法以获得最终的 JSON 输出,如下所示?

    [
   {
      "field1": "val1",
      "field2": "val2",
      "field3": "val3"
   },
   {
      "field1": "val1",
      "field2": "val2",
      "field3": "val3"
   },
   {
      "field1": "val1",
      "field2": "val2",
      "field3": "val3"
   }
]

【问题讨论】:

  • “XML_F52E2B61-18A1-11d1-B105-00805F49916B”从何而来?
  • 输入的 XML 无效。它没有单个根元素。任何正确的 XML 解析器都会拒绝它。
  • 我想我明白了。输入应该被视为文本,而不是 XML,对吧?
  • "XML_F52E2B61-18A1-11d1-B105-00805F49916B" 来自从数据库存储过程形状获取输入的转换形状的输出。幸运的是,它不会随着每次部署而改变。没错,我们作为 SQL 输出获得的 XML 不是有效的 XML,因为它没有根节点。但是如果我们得到所有 '"XML_F52E2B61-18A1-11d1-B105-00805F49916B" 节点的值,我们就可以用它来形成一个有效的 XML。
  • 我添加了一个带有固定 ID 的答案。如果您需要它来自其他地方,请在问题中添加对来源的解释。

标签: arrays json xml dataweave mulesoft


【解决方案1】:

输入:

{
  "resultSet1": [
    {
      "XML_F52E2B61-18A1-11d1-B105-00805F49916B": "<xmlcontent><field1>val1</field1><field2>val2</field2><field3>val3</field3>" 
    },
    {
      "XML_F52E2B61-18A1-11d1-B105-00805F49916B": "</xmlcontent><xmlcontent><field1>val1</field1><fiel" 
    },
    {
      "XML_F52E2B61-18A1-11d1-B105-00805F49916B": "d2>val2</field2><field3>val3</field3></xmlcontent>"
    }
  ]
}

脚本:

%dw 2.0
output application/json
var id='XML_F52E2B61-18A1-11d1-B105-00805F49916B'
var body=payload.resultSet1 map (
    $[id]) reduce ((item, accumulator) -> accumulator ++ item)

---
read('<root>' ++ body ++ '</root>', "application/xml").root.*xmlcontent

输出:

[
  {
    "field1": "val1",
    "field2": "val2",
    "field3": "val3"
  },
  {
    "field1": "val1",
    "field2": "val2",
    "field3": "val3"
  }
]

【讨论】:

  • 谢谢,我稍加修改就能得到所需的输出。我得到了 XML 字符串并将其映射为 JSON 格式,必须在映射中跳过 XML 中的一些字段。
猜你喜欢
  • 2020-07-20
  • 2020-05-24
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2022-09-26
  • 1970-01-01
相关资源
最近更新 更多