Проблемы с объединением ответа xml и ответа json в Dataweave

У меня есть ответ в формате 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
 })
 }))
 }

Не могли бы вы помочь мне добиться того же !!

Спасибо !!


person user3368821    schedule 26.08.2018    source источник
comment
Похоже, вы предполагаете, что и XML, и JSON равны payload, но это не так. Вы должны использовать enricher, чтобы окружить один из запросов и установить ответ на flowVar.   -  person jerney    schedule 27.08.2018
comment
Привет, Джерни, извини, это был тип, ответ мыла действительно находится в переменной потока, а другой - в полезной нагрузке. Но это не работает. Я тоже исправил этот фрагмент.   -  person user3368821    schedule 28.08.2018
comment
Извините, я не заметил этого в первый раз, но ваш XML-документ имеет 2 корня (idc:document), и он должен иметь только один. Вы уверены, что это правильный ответ?   -  person jerney    schedule 28.08.2018
comment
Да, Джерни, эта служба вызывается в цикле, а результаты заносятся в список массивов. После цикла у меня есть преобразование, в котором я хочу достичь указанного выше json !!   -  person user3368821    schedule 29.08.2018


Ответы (1)


Я буду работать в предположении, что ваш 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
    })
  })
}  
person jerney    schedule 28.08.2018