在Dataweave中合并xml响应和json响应的问题

时间:2018-08-26 22:19:13

标签: json mule dataweave mule-esb

我从soap服务之一获得以下xml响应:

<?xml version="1.0" encoding="UTF-8"?>
<idc:document DocUrl="//abc.com:443/images/ywnj/mdi5/~edisp/test.jpg" dDocFormats="image/jpeg" dDocName="Test1" dDocTitle="Test1.jpg" dID="603" dName="sysadmin" dStatus="RELEASED" dUser="anonymous" xmlns:idc="//www.stellent.com/IdcService/">
	<idc:field name="encodeDocUrl"/>
	<idc:field name="localizedForResponse">1</idc:field>
	<idc:field name="hasAnnotations">0</idc:field>
	<idc:field name="hasStickyNotes">0</idc:field>
	<idc:field name="dSubscriptionID">Test1</idc:field>
	<idc:field name="idcToken"/>
	<idc:resultset TotalRows="2" name="manifest">
		<idc:row>
			<idc:field name="extRenditionName">indexData</idc:field>
		</idc:row>
		<idc:row>
			<idc:field name="extRenditionName">48x48_GIF</idc:field>
		</idc:row>
		<idc:row>
			<idc:field name="extRenditionName">180x180_GIF</idc:field>
		</idc:row>
	</idc:resultset>
</idc:document>	
<idc:document DocUrl="//abc.com:443/images/ywnj/mdi5/~edisp/test23.jpg" dDocFormats="image/jpeg" dDocName="Test23" dDocTitle="Test23.jpg" dID="603" dName="sysadmin" dStatus="RELEASED" dUser="anonymous" xmlns:idc="//www.stellent.com/IdcService/">
	<idc:field name="encodeDocUrl"/>
	<idc:field name="localizedForResponse">1</idc:field>
	<idc:field name="hasAnnotations">0</idc:field>
	<idc:field name="hasStickyNotes">0</idc:field>
	<idc:field name="dSubscriptionID">Test23</idc:field>
	<idc:field name="idcToken"/>
	<idc:resultset TotalRows="2" name="manifest">
		<idc:row>
			<idc:field name="extRenditionName">indexData</idc:field>
		</idc:row>
		<idc:row>
			<idc:field name="extRenditionName">90x90_GIF</idc:field>
		</idc:row>
		<idc:row>
			<idc:field name="extRenditionName">250x250_GIF</idc:field>
		</idc:row>
	</idc:resultset>
</idc:document>	
		

并且我从另一个rest服务收到以下json响应:

{
  "results": [
    {
      "ID": "1",
      "ImageID": "2",
      "Name": "Test1",
      "Owner": "sysadmin",
      "Author": "sysadmin",
      "Creator": "sysadmin"
	},
	{
      "ID": "2",
      "ImageID": "23",
      "Name": "Test23",
      "Owner": "sysadmin",
      "Author": "sysadmin",
      "Creator": "sysadmin"
	}
  ]
}

并且我想实现json以下的最终版本(仅当xml dDocName与JSON中的Name匹配时,才能映射来自soap响应的数据。)

{
  "results": [
    {
      "ID": "1",
      "ImageID": "2",
      "Name": "Test1",
      "Owner": "sysadmin",
      "Author": "sysadmin",
      "Creator": "sysadmin"
	  "links": [
                {
                    "rel": "indexData",
                    "href": "/abc/indexData"
                },
                {
                    "rel": "48x48_GIF",
                    "href": "/abc/48x48_GIF"
                },
				{
                    "rel": "180x180_GIF",
                    "href": "/abc/180x180_GIF"
                }
            ]
	},
	{
      "ID": "2",
      "ImageID": "23",
      "Name": "Test23",
      "Owner": "sysadmin",
      "Author": "sysadmin",
      "Creator": "sysadmin"
	  "links": [
                {
                    "rel": "indexData",
                    "href": "/abc/indexData"
                },
                {
                    "rel": "90x90_GIF",
                    "href": "/abc/90x90_GIF"
                },
				{
                    "rel": "250x250_GIF",
                    "href": "/abc/250x250_GIF"
                }
            ]
	}
  ]
}

我尝试在dataweave中创建以下内容,但它不起作用:

%dw 1.0
%output application/json
---
{
  "packshots": (payload.searchResults pluck ({
   "ID": $.xAH_StoreItemNumber,
   "ImageID": $.dID,
   "Name": $.dDocName,
   "Owner": $.dDocOwner,
   "Author": $.dDocAuthor,
   "Creator": $.dDocCreator,
    "links": (flowVars.renditionResp."idc:document"."idc:resultset"."idc:row" (filter $.dDocName == flowVars.CurrentName) map {
 "rel":$."idc:field".@extRenditionName,
 "href": "/abc" ++ $."idc:field".@extRenditionName
 })
 }))
 }

您能帮我实现同样的目标吗!

谢谢!!

1 个答案:

答案 0 :(得分:0)

我将假设您的XML具有一个名为idc:root的根标签。我首先要做的是按idc:dDocName对XML进行分组。这样,您就可以在需要时提取renditionResp变量的正确部分。

然后,脚本的其余部分将如下所示:

%dw 1.0
%output application/json

%var docs = flowVars.renditionResp."idc:root" groupBy $."idc:dDocName"
---
{
  "packshots": (payload.searchResults pluck ((value) -> {
    "ID":      value.xAH_StoreItemNumber,
    "ImageID": value.dID,
    "Name":    value.dDocName,
    "Owner":   value.dDocOwner,
    "Author":  value.dDocAuthor,
    "Creator": value.dDocCreator,
    "links":   docs[flowVars.CurrentName] map ((link) -> {
      "rel":  link."idc:field".@extRenditionName,
      "href": "/abc" ++ link."idc:field".@extRenditionName
    })
  })
}