Проблемы при объединении ответов xml и json в Dataweave - PullRequest
0 голосов
/ 27 августа 2018

У меня есть приведенный ниже ответ 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>	
		

, и у меня есть ответ ниже 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.)

{
  "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 голосов
/ 28 августа 2018

Я собираюсь работать в предположении, что ваш XML имеет корневой тег с именем idc:root.Сначала я сгруппировал XML по idc:dDocName.Это позволит вам вытащить правильную часть переменной 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
    })
  })
}  
...