You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Prowide Java库从SwiftMX提取UETR及解析问题求助

解决Prowide-ISO20022解析SwiftMX消息的问题

问题说明

我是Java处理Swift消息的新手,正在使用prowide-iso20022库解析SwiftMX消息,需要提取UETR(OrgnlUETR)及其他信息,但这些字段在不同类型消息的XML中层级位置不同。目前遇到两个问题:

  • 使用AbstractMX.parse(xml)解析通用结构时返回null,无法完成解析;
  • 可通过MxSwiftMessage.parse(xml)获取AppHdr中的msgDefIdr识别消息类型,但不知道如何解析结构不同的各类消息。

解决方案

问题1:AbstractMX.parse(xml)返回null的解决办法

AbstractMX.parse()方法只能解析纯ISO 20022标准的Document部分XML,而你传入的是包含Swift包装层(<SwiftMx>、<Header>、<Body>等节点)的完整消息,所以会返回null。

解决步骤:

  1. 先用MxSwiftMessage.parse()解析完整消息;
  2. 通过swiftMessage.getDocumentXml()提取出<Document>标签内部的XML内容;
  3. 将提取后的XML传给AbstractMX.parse()或者对应消息类型的parse方法。

问题2:根据消息类型解析不同结构的消息

Prowide库针对每个ISO20022消息类型都生成了对应的实现类(比如camt.029.001.09对应MxCaMt02900109),可以通过msgDefIdr映射到具体类,再进行类型化解析。

完整代码示例:

// 1. 解析完整的SwiftMX消息
MxSwiftMessage swiftMessage = MxSwiftMessage.parse(xmlContent);

// 2. 获取消息类型标识msgDefIdr
String msgDefIdr = swiftMessage.getAppHdr().getMsgDefIdr();

// 3. 提取Document部分的纯ISO20022 XML
String documentXml = swiftMessage.getDocumentXml();

// 4. 根据msgDefIdr获取对应的MX实现类
MxId mxId = MxId.fromString(msgDefIdr);
Class<? extends AbstractMX> mxClass = mxId.getImplClass();

// 5. 反射调用parse方法解析Document XML
AbstractMX mxMessage = mxClass.getMethod("parse", String.class).invoke(null, documentXml);

// 6. 根据消息类型强转后提取字段(以camt.029.001.09为例)
if (mxMessage instanceof MxCaMt02900109) {
    MxCaMt02900109 camt029 = (MxCaMt02900109) mxMessage;
    // 提取UETR
    String uetr = camt029.getRsltnOfInvstgtn().getCxlDtls().getTxInfAndSts().getOrgnlUETR();
    // 提取其他所需字段,直接调用对应getter方法即可
}

补充说明

  • 所有消息类型对应的类都在com.prowidesoftware.swift.model.mx包下,命名规则是Mx+消息类型的驼峰转换(比如camt.029.001.09转为MxCaMt02900109);
  • 如果不想用反射,也可以通过switch-case根据msgDefIdr直接实例化对应类进行解析,可读性更强;
  • 若需要通用提取UETR而不区分消息类型,可以通过遍历XML节点的方式,但类型化解析更可靠且不易出错。

内容的提问来源于stack exchange,提问作者SYED SAQIB S A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:35:00