有没有办法将 XML 输入的 "copy and paste" 内容传送到 DataWeave 中的 JSON 输出?

Is there a way to "copy and paste" content from the XML input to the JSON output in DataWeave?

我有一个奇怪的案例需要帮助:我有一份 XML 文件,我想使用 DW 将其带到 JSON,这很容易,但我也想带一些属性并将原始 XML 内容的某些部分粘贴为它们的值,以避免在我的工作流程中出现界面问题。

更具体地说,我希望将符合该类型元素列表的特定标签的所有元素和 return XML 中的相同列表作为字符串。示例场景如下所示:

输入

<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>

  <book category="children">
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>

输出

{"book": "<book category=\"cooking\"><title lang=\"en\">EverydayItalian</title><author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book><book category=\"children\"><title lang=\"en\">Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book>"}

这就是我到达接近解决方案的程度。 Report_DataReport_Entry 只是在这种情况下包装信息。我希望收到各种 Report_Entry 元素,所以这仍然是草稿。

%dw 2.0
import * from dw::core::Types
import mergeWith from dw::core::Objects
input payload xml
output application/json

var literalKeys = (namesOf(payload.Report_Data.Report_Entry) distinctBy ((item, index) -> item)) filter ((item) -> not isObjectType(typeOf(payload.Report_Data.Report_Entry[item])))

var objectKeys = (namesOf(payload.Report_Data.Report_Entry) distinctBy ((item, index) -> item)) filter ((item) -> isObjectType(typeOf(payload.Report_Data.Report_Entry[item])))

var allObjects = payload.Report_Data.Report_Entry filterObject((value, key, index) -> objectKeys reduce ((item, accumulator = false) -> (key ~= item) or accumulator))

var justTheScalars = payload.Report_Data.Report_Entry filterObject((value, key, index) -> not (objectKeys reduce ((item, accumulator = false) -> (key ~= item) or accumulator)))

var groupedAllObjects = allObjects groupBy (item, index) -> index

---

justTheScalars mergeWith (groupedAllObjects)

我说到了重点

  1. 确定哪些键对应于对象,哪些键对应于文字
  2. 从我的输入中除以所有对象和内部的所有标量
  3. 根据 class 将对象组合在一起并 return 合并对象

但我仍然错过了我可以以某种方式获取输入并粘贴为字符串或以某种方式将其转换为字符串以避免信息丢失的部分。

请考虑到这种情况是使用 DW 的特殊情况,因为我没有关于不同 Report_Entry 中会出现什么的信息,这就是为什么我要结合使用动态获取键和值的函数。

让 DataWeave 知道您想将每本书写成 XML 字符串会更简单。

%dw 2.0
output application/json
---
payload.bookstore  mapObject {
    book: write({($$): $}, "application/xml",{writeDeclaration:false})
}

输出:

{
  "book": "<book category=\"cooking\">\n  <title lang=\"en\">Everyday Italian</title>\n  <author>Giada De Laurentiis</author>\n  <year>2005</year>\n  <price>30.00</price>\n</book>",
  "book": "<book category=\"children\">\n  <title lang=\"en\">Harry Potter</title>\n  <author>J K. Rowling</author>\n  <year>2005</year>\n  <price>29.99</price>\n</book>"
}

我更新了解决方案以发出属性并避免 XML 声明。

抱歉 - 我有点困惑。您只是想将输入序列化为字符串?

输入:

<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>

  <book category="children">
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>

数据编织:

%dw 2.0
output application/json
---
payload.bookstore.*book map {
    "book": write({ book: $ }, 'application/xml', {writeDeclaration: false, indent: false})
}

输出:

[
  {
    "book": "<book><title lang=\"en\">Everyday Italian</title><author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book>"
  },
  {
    "book": "<book><title lang=\"en\">Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book>"
  }
]

编辑:

如果您只想要一个字符串数组:

%dw 2.0
output application/json
---
payload.bookstore.*book map write({ book: $ }, 'application/xml', {writeDeclaration: false, indent: false})

输出:

[
  "<book><title lang=\"en\">Everyday Italian</title><author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book>",
  "<book><title lang=\"en\">Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book>"
]