Извлечение UETR из SwiftMX с использованием библиотеки Java Prowide

Я новичок в обработке быстрых сообщений в Java, я пытаюсь с помощью Java-библиотеки программного обеспечения prowide-iso20022 анализировать сообщения SwiftMX (https://github.com/prowide/prowide-iso20022)

Я хочу извлечь UETR (OrgnlUETR) сообщения и другую подобную необходимую информацию из сообщения. Я думаю, что эти поля могут находиться в разных местах/иерархии в xml для разных типов сообщений (т. е. нет общей иерархии). Нужна помощь в том, как извлечь обязательные поля, поскольку в SwiftMX есть много типов сообщений.

Ниже приведен пример/фиктивное сообщение SwiftMX для справки.

      <SwiftMx>
    <Header>
        <DestinationID>ABC</DestinationID>
        <SenderID>PQR</SenderID>
        <OperationOrganizationID/>
        <MessageType>ISO22IN</MessageType>
        <DateSent>20200321</DateSent>
        <TimeSent>0829</TimeSent>
        <MessageID>3190eee</MessageID>
    </Header>
    <SubHeader>
        <ReceiverAddress>ZYDFUS562WW</ReceiverAddress>
        <SenderAddress>NCBACATEEE</SenderAddress>
    </SubHeader>
    <Body>
        <ISOMessage>
            <AppHdr>
                <Fr>
                    <FIId>
                        <FinInstnId>
                            <BICFI>NCBACATEEE</BICFI>
                        </FinInstnId>
                    </FIId>
                </Fr>
                <To>
                    <FIId>
                        <FinInstnId>
                            <BICFI>ZYDFUS562WW</BICFI>
                        </FinInstnId>
                    </FIId>
                </To>
                <BizMsgIdr>IMDLC6928</BizMsgIdr>
                <MsgDefIdr>camt.029.001.09</MsgDefIdr> 
                <BizSvc>swift.cbprplus.02</BizSvc>
                <CreDt>2010-09-31T04:49:45+03:00</CreDt>
            </AppHdr>
            <Document>
                <RsltnOfInvstgtn>
                    <Assgnmt>
                        <Id>IMDLC69S01</Id>
                        <Assgnr>
                            <Agt>
                                <FinInstnId>
                                    <BICFI>SNDRCAXX</BICFI>
                                </FinInstnId>
                            </Agt>
                        </Assgnr>
                        <Assgne>
                            <Agt>
                                <FinInstnId>
                                    <BICFI>SNDXX</BICFI>
                                </FinInstnId>
                            </Agt>
                        </Assgne>
                        <CreDtTm>2010-09-29T04:49:45+03:00</CreDtTm>
                    </Assgnmt>
                    <Sts>
                        <Conf>RJCR</Conf>
                    </Sts>
                    <CxlDtls>
                        <TxInfAndSts>
                            <CxlStsId>TESTID</CxlStsId>
                            <RslvdCase>
                                <Id>123</Id>
                                <Cretr>
                                    <Pty>
                                        <Nm>XYZ LTD</Nm>
                                        <Id>
                                            <OrgId>
                                                <AnyBIC>SNDRCAXXX</AnyBIC>
                                            </OrgId>
                                        </Id>
                                        <CtryOfRes>IN</CtryOfRes>
                                    </Pty>
                                </Cretr>
                            </RslvdCase>
                            <OrgnlGrpInf>
                                <OrgnlMsgId>YT123</OrgnlMsgId>
                                <OrgnlMsgNmId>IEUW79</OrgnlMsgNmId>
                            </OrgnlGrpInf>
                            <OrgnlUETR>9de-aed0-16487c27b42d</OrgnlUETR>
                        </TxInfAndSts>
                    </CxlDtls>
                </RsltnOfInvstgtn>
            </Document>
        </ISOMessage>
    </Body>
    <Timestamp>
        <Date>20200327</Date>
        <Time>123424</Time>
    </Timestamp>
</SwiftMx>
  1. Невозможно проанализировать, используя абстрактный класс ниже, возвращая значение null из метода синтаксического анализа.parse into generic structure AbstractMX mx = AbstractMX.parse(xml);

  2. Я хочу знать тип сообщения, которое мне удалось извлечь, используя приведенный ниже код. MxSwiftMessage mxSwiftMessage = MxSwiftMessage.parse(xml); String msgDefIdr = ((BusinessAppHdrV01) mxSwiftMessage.getAppHdr()).getMsgDefIdr();
    Но это работает только для AppHdr, и я не знаю, как анализировать сообщения с разной структурой.

1 ответ

Похоже, вы пытаетесь проанализировать неизвестное сообщение типа SWIFT MX. В этом случае вы можете посмотреть предоставленные примеры в официальном репозитории Prowide ISO20022 Github, который можно найти здесь. Там вы также найдете поддержку сообщества.

Пример анализа сообщения неизвестного типа может выглядеть примерно так:

      public class MxParseUnknownMessageType {
    public static void main(String[] args) {
        String xml = "YOUR_XML_MESSAGE_HERE";
        // parse into generic structure
        AbstractMX mx = AbstractMX.parse(xml);
        System.out.println("Parsed message type: " + mx.getMxId().id());
        // check the parsed type and cast to specific model
        if ("camt.048.001.03".equals(mx.getMxId().id())) {
            MxCamt04800103 camt = (MxCamt04800103) mx;
            System.out.println("Message id: " + camt.getModfyRsvatn().getMsgHdr().getMsgId());
        }
    }
}

Просто заменитес вашей XML-строкой.

Этот код преобразует XML в общую структуру SWIFT MX. Затем он проверяет тип сообщения и, если оно соответствует заданному типу («camt.048.001.03»), приводит его к определенному классу модели и извлекает необходимые поля.

Для полей, которые могут появляться в разных местах, вам придется проверить проанализированное сообщение на предмет различных потенциальных путей. Каждое сообщение типа SWIFT MX имеет свой собственный класс модели, а расположение полей определяется в соответствии со стандартом сообщений SWIFT MX.

Что касается получения UETR:

Основные возможности проекта iso-20022 включают предложение модели Java для ISO 20022 MX (например, класс MxPacs00800109), упрощение синтаксического анализа модели XML в модель Java и построения модели Java в XML. Кроме того, он также позволяет конвертировать в JSON.

Учитывая это, у вас есть возможность использовать стандартный анализатор XML и адаптировать сообщение XML на любом этапе вашего процесса. Аналогичным образом вы можете преобразовать сообщение в JSON и выполнить эквивалентные операции. Однако если вы решите использовать модель Java, каждое сообщение будет уникальным, что потребует досконального знания структуры для доступа к этому значению.

      new MxPacs01000103().getFIDrctDbt().getCdtInstr().getDrctDbtTxInf().getPmtId().getUETR()

new MxPacs00800108().getFIToFICstmrCdtTrf().getCdtTrfTxInf().get(0).getPmtId().getUETR();

Надеюсь это поможет!

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