使用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。
解决步骤:
- 先用
MxSwiftMessage.parse()解析完整消息; - 通过
swiftMessage.getDocumentXml()提取出<Document>标签内部的XML内容; - 将提取后的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
相关产品推荐
相关产品推荐

