Удалить атрибуты и значения из XML, когда они соответствуют заданному ключу

Мне нужно удалить несколько полей из полезной нагрузки 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 03.04.2023 18:18

@aled обновил вопрос.TIA!

daringfireball 03.04.2023 18:33

Является ли результат, который вы добавили, ожидаемым результатом или фактическим результатом?

aled 03.04.2023 19:10

@aled это ожидаемый результат. вы могли видеть, что несколько тегов и атрибутов были удалены.

daringfireball 03.04.2023 19:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ввод не является допустимым 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>

если вход имеет несколько атрибутов. это не работает.

daringfireball 05.04.2023 21:25

Пожалуйста, предоставьте более подробную информацию. Что не работает? Возможно, вход, который не работает, поможет сузить проблему.

sudhish_s 05.04.2023 23:00

обновили вопрос с образцом ввода. проблема здесь в том, что если тег имеет несколько значений атрибутов, он выводит XML только с одним атрибутом, остальные атрибуты не сохраняются.

daringfireball 05.04.2023 23:17

Я исходил из исходного поста - Basically, it has remove whereever the fields are available like tag/value/attributes. Код удаляет совпадающие имя и значение атрибута/тега. Поскольку вы добавили account и code в список фильтров, он удаляет атрибуты со значениями, соответствующими фильтру. Но похоже, вы не хотите удалять соответствующее значение атрибута. Я обновил код, удалив условие фильтра значения атрибута.

sudhish_s 06.04.2023 14:21

Другие вопросы по теме