Мне нужно удалить несколько полей из полезной нагрузки XML. Я написал функцию ниже, но она проверяет и удаляет только ключи.
Как применить условие также к атрибутам и значениям?
По сути, он удаляет все доступные поля, такие как тег/значение/атрибуты.
Образец ввода
%dw 1.0
%output application/xml skipNullOn = "everywhere"
%function remove(content, filterList)
content match {
:array -> $ map (value,index) -> remove(value, filterList),
:object -> $ mapObject (value,key) ->
(key) @((key.@)) : null when (filterList contains key as :string)
otherwise remove(value, filterList)
,
default -> content
}
---
remove(payload, ["userId","companyId","account"])
@aled обновил вопрос.TIA!
Является ли результат, который вы добавили, ожидаемым результатом или фактическим результатом?
@aled это ожидаемый результат. вы могли видеть, что несколько тегов и атрибутов были удалены.
Ввод не является допустимым XML, я обновил его, чтобы сделать его действительным. Следующий Dataweave удаляет все имя/значение атрибута и тег/значение, соответствующие списку фильтров.
Обратите внимание, что в выходном атрибуте type
удалено, потому что значение соответствует account
Вход
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv = "http://www.w3.org/2003/05/soap-envelope" xmlns:test = "http://host.com2003/05/soap-envelope" xmlns:ns6 = "http://host.com/V001">
<soapenv:Header>
<axis2ns11343:OSARequestHeader xmlns:axis2ns11343 = "http://www.host.com/xmlschema/resource/metadata/osa/infrastructure/v001" soapenv:mustUnderstand = "false">
<axis2ns11343:userId>e2eauto01a</axis2ns11343:userId>
<axis2ns11343:companyId>test</axis2ns11343:companyId>
<axis2ns11343:companyType/>
<axis2ns11343:clientMachineId>1.1.1.1</axis2ns11343:clientMachineId>
</axis2ns11343:OSARequestHeader>
<axis2ns11344:cpsMessageHeader xmlns:axis2ns11344 = "http://host.com/xsd/types/V002" type = "currency" guid = "28cd611f-2e08-4650-8217-cdd27284968f" soapenv:mustUnderstand = "false" traceId = "28cd611f-2e08-4650-8217-cdd27284968f"/>
</soapenv:Header>
<soapenv:Body>
<ns8:getCurrencyProfileRequest xmlns:ns8 = "http://host.com/xsd/service/V001" accType = "code" username = "username" type = "account">
<ns8:userInfo>
<ns3:type xmlns:ns3 = "http://host.com/xsd/commontypes/V001">accountNo</ns3:type>
<ns3:companyId xmlns:ns3 = "http://host.com/xsd/commontypes/V001">string</ns3:companyId>
<ns3:userId xmlns:ns3 = "http://host.com/xsd/commontypes/V001">string</ns3:userId>
<ns3:accountNo xmlns:ns3 = "http://host.com/xsd/commontypes/V001">string</ns3:accountNo>
<ns3:txid xmlns:ns3 = "http://host.com/xsd/commontypes/V001">string</ns3:txid>
</ns8:userInfo>
</ns8:getCurrencyProfileRequest>
</soapenv:Body>
</soapenv:Envelope>
%dw 1.0
%output application/xml skipNullOn = "everywhere"
%function checkAndRemoveAttributes (attribs, filterList)
(attribs default {}) mapObject {
($$): null when (filterList contains ($$ as :string)) otherwise $
}
%function remove(content, filterList)
content match {
:object -> $ mapObject (value,key) ->
(key) @((checkAndRemoveAttributes(key.@,filterList))): null when (filterList contains key as :string)
otherwise remove(value, filterList)
,
default -> null when (filterList contains content as :string) otherwise content
}
---
remove(payload, ["userId","companyId","account","username", "code"])
Выход
<?xml version='1.0' encoding='US-ASCII'?>
<soapenv:Envelope xmlns:soapenv = "http://www.w3.org/2003/05/soap-envelope">
<soapenv:Header>
<axis2ns11343:OSARequestHeader xmlns:axis2ns11343 = "http://www.host.com/xmlschema/resource/metadata/osa/infrastructure/v001" soapenv:mustUnderstand = "false">
<axis2ns11343:companyType></axis2ns11343:companyType>
<axis2ns11343:clientMachineId>1.1.1.1</axis2ns11343:clientMachineId>
</axis2ns11343:OSARequestHeader>
<axis2ns11344:cpsMessageHeader xmlns:axis2ns11344 = "http://host.com/xsd/types/V002" type = "currency" guid = "28cd611f-2e08-4650-8217-cdd27284968f" soapenv:mustUnderstand = "false" traceId = "28cd611f-2e08-4650-8217-cdd27284968f"></axis2ns11344:cpsMessageHeader>
</soapenv:Header>
<soapenv:Body>
<ns8:getCurrencyProfileRequest xmlns:ns8 = "http://host.com/xsd/service/V001" accType = "code" type = "account">
<ns8:userInfo>
<ns3:type xmlns:ns3 = "http://host.com/xsd/commontypes/V001">accountNo</ns3:type>
<ns3:accountNo xmlns:ns3 = "http://host.com/xsd/commontypes/V001">string</ns3:accountNo>
<ns3:txid xmlns:ns3 = "http://host.com/xsd/commontypes/V001">string</ns3:txid>
</ns8:userInfo>
</ns8:getCurrencyProfileRequest>
</soapenv:Body>
</soapenv:Envelope>
если вход имеет несколько атрибутов. это не работает.
Пожалуйста, предоставьте более подробную информацию. Что не работает? Возможно, вход, который не работает, поможет сузить проблему.
обновили вопрос с образцом ввода. проблема здесь в том, что если тег имеет несколько значений атрибутов, он выводит XML только с одним атрибутом, остальные атрибуты не сохраняются.
Я исходил из исходного поста - Basically, it has remove whereever the fields are available like tag/value/attributes
. Код удаляет совпадающие имя и значение атрибута/тега. Поскольку вы добавили account
и code
в список фильтров, он удаляет атрибуты со значениями, соответствующими фильтру. Но похоже, вы не хотите удалять соответствующее значение атрибута. Я обновил код, удалив условие фильтра значения атрибута.
Пожалуйста, предоставьте пример ввода, фактического результата и ожидаемого результата.