Извлечение 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>
Невозможно проанализировать, используя абстрактный класс ниже, возвращая значение null из метода синтаксического анализа.
parse into generic structure AbstractMX mx = AbstractMX.parse(xml);
Я хочу знать тип сообщения, которое мне удалось извлечь, используя приведенный ниже код.
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 в общую структуру 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();
Надеюсь это поможет!