前言
日常工作中有解析xml字符串,并获取其中的枝干节点下所有子节点的内容,或者获取叶子节点的值, 也有替换叶子节点值的需求,所以写了一个公共方法。该方法使用了Dom4j解析和广度优先遍历,遍历Document节点找到自己需要的节点。也推荐使用深度优先遍历,通过性能测试找到适合自己的遍历方案。
如有问题欢迎指正, 技术大神请一笑而过^^
正文代码
import org.apache.commons.lang3.StringUtils;
import org.dom4j.*;
import org.dom4j.tree.DefaultElement;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
public class DocumentUtil {
/**
* 广度优先遍历xml每个节点,找到对应的节点
* @param documentStr // xml字符串
* @param searchNodeStr // 查询的标签
* @param containsCurrentLabel // 返回值是否包含当前标签, 只有查枝干节点需要填写, 否则无用
* @param parentNodeName // 替换标签里的值时,填写查询的标签的父亲标签名, 用于定位唯一标签. 只有叶子节点需要填写, 否则填写无用
* @param replaceStr // 替换标签里的值时,填写要替换的值, 只有叶子节点需要填写, 否则填写无用
* @return
*/
public static String getDocumentNodeValue(String documentStr, String searchNodeStr, boolean containsCurrentLabel, String parentNodeName, String replaceStr) {
if (StringUtils.isBlank(documentStr) || StringUtils.isBlank(searchNodeStr)) return null;
Document document = null;
try {
document = DocumentHelper.parseText(documentStr);
} catch (DocumentException e) {
//看情况决定是否要抛出异常
return null;
}
Queue<Element> queue = new LinkedList<>();
assert document != null;
// 往队列里添加节点
queue.offer(document.getRootElement());
while (!queue.isEmpty()) {
//返回队首节点的同时删除队首节点
Element poll = queue.poll();
Iterator<Node> iterator = poll.nodeIterator();
while (iterator.hasNext()) {
Node next = iterator.next();
if (next instanceof Element) {
queue.offer((Element) next);
if (next.getName().equalsIgnoreCase(searchNodeStr)) {
if (((DefaultElement) next).elements().size() > 0) {
String endLabel = "</".concat(((DefaultElement) next).getQualifiedName()).concat(">");
// 包含当前标签
if (containsCurrentLabel) {
String parentNodeText = next.getParent().asXML();
String startLabel = "<".concat(((DefaultElement) next).getQualifiedName());
return parentNodeText.substring(parentNodeText.indexOf(startLabel), parentNodeText.indexOf(endLabel) + endLabel.length());
} else {
// 只查标签里面的内容
String nodeText = next.asXML();
return nodeText.substring(nodeText.indexOf(">") + 1, nodeText.indexOf(endLabel));
}
} else {
// 如果传了父节点的名字, 判断是不是给定父节点下的标签
if (StringUtils.isNotBlank(parentNodeName) && !next.getParent().getQualifiedName().contains(parentNodeName)) {
continue;
}
// 只查叶子节点的值
if (StringUtils.isNotBlank(replaceStr)) {
//替换叶子节点的值
next.setText(replaceStr);
// 返回整个xml字符串
return document.asXML();
} else{
// 返回叶子结点内的值
return next.getText();
}
}
}
}
}
}
return null;
}
}
测试素材
测试素材1所用的无命名空间前缀xml:
<?xml version="1.0" encoding="UTF-8" ?>
<Saa:DataPDU
xmlns:Saa="urn:swift:saa:xsd:saa.2.0"
xmlns:Sw="urn:swift:snl:ns.Sw"
xmlns:SwInt="urn:swift:snl:ns.SwInt"
xmlns:SwGbl="urn:swift:snl:ns.SwGbl"
xmlns:SwSec="urn:swift:snl:ns.SwSec">
<Saa:Revision>2.0.12</Saa:Revision>
<Saa:Header>
<Saa:Message>
<Saa:SenderReference>IABOCAU2SXXX056$2211087869545</Saa:SenderReference>
<Saa:MessageIdentifier>camt.056.001.09</Saa:MessageIdentifier>
<Saa:Format>MX</Saa:Format>
<Saa:SubFormat>Input</Saa:SubFormat>
<Saa:Sender>
<Saa:DN>ou=xxx,o=cmbcau2s,o=swift</Saa:DN>
<Saa:FullName>
<Saa:X1>CMBCAU2SXXX</Saa:X1>
<Saa:X2>xxx</Saa:X2>
</Saa:FullName>
</Saa:Sender>
<Saa:Receiver>
<Saa:DN>ou=xxx,o=abocau2s,o=swift</Saa:DN>
<Saa:FullName>
<Saa:X1>ABOCAU2SXXX</Saa:X1>
<Saa:X2>xxx</Saa:X2>
</Saa:FullName>
</Saa:Receiver>
<Saa:InterfaceInfo>
<Saa:UserReference>ASOO016FV000001</Saa:UserReference>
</Saa:InterfaceInfo>
<Saa:NetworkInfo>
<Saa:Priority>Normal</Saa:Priority>
<Saa:IsPossibleDuplicate>false</Saa:IsPossibleDuplicate>
<Saa:Service>apn.hvcs</Saa:Service>
<Saa:SWIFTNetNetworkInfo>
<Saa:RequestType>camt.056.001.09</Saa:RequestType>
<Saa:Reference>0fac415a-5efb-41ed-a5b3-83f118d8e998</Saa:Reference>
</Saa:SWIFTNetNetworkInfo>
</Saa:NetworkInfo>
<Saa:ExpiryDateTime>20221128001951</Saa:ExpiryDateTime>
</Saa:Message>
</Saa:Header>
<Saa:Body>
<AppHdr
xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">
<Fr>
<FIId>
<FinInstnId>
<BICFI>CMBCAU2SXXX</BICFI>
</FinInstnId>
</FIId>
</Fr>
<To>
<FIId>
<FinInstnId>
<BICFI>ABOCAU2SXXX</BICFI>
</FinInstnId>
</FIId>
</To>
<BizMsgIdr>CMBCAU2SXXX20221108SA00000000001HV0</BizMsgIdr>
<MsgDefIdr>CAMTTEST20221108002</MsgDefIdr>
<BizSvc>apn.hvcs.01</BizSvc>
<CreDt>2022-11-08T17:20:00+10:00</CreDt>
</AppHdr>
<Document
xmlns="urn:iso:std:iso:20022:tech:xsd:camt.056.001.09">
<FIToFIPmtCxlReq>
<Assgnmt>
<Id>CMBCAU2SXXX20221108SA00000000001HV0</Id>
<Assgnr>
<Agt>
<FinInstnId>
<BICFI>CMBCAU2SXXX</BICFI>
</FinInstnId>
</Agt>
</Assgnr>
<Assgne>
<Agt>
<FinInstnId>
<BICFI>ABOCAU2SXXX</BICFI>
</FinInstnId>
</Agt>
</Assgne>
<CreDtTm>2022-11-08T17:20:00+10:00</CreDtTm>
</Assgnmt>
<Undrlyg>
<OrgnlGrpInfAndCxl>
<OrgnlMsgId>PACS009TESTABOC</OrgnlMsgId>
<OrgnlMsgNmId>PACS.009.001.01</OrgnlMsgNmId>
<OrgnlCreDtTm>2022-11-04T17:20:00+10:00</OrgnlCreDtTm>
<CxlRsnInf>
<Rsn>
<Cd>UPAY</Cd>
</Rsn>
</CxlRsnInf>
</OrgnlGrpInfAndCxl>
</Undrlyg>
</FIToFIPmtCxlReq>
</Document>
</Saa:Body>
</Saa:DataPDU>
测试素材2所用的有命名空间前缀xml:
<?xml version="1.0" encoding="UTF-8" ?>
<Saa:DataPDU
xmlns:Saa="urn:swift:saa:xsd:saa.2.0"
xmlns:Sw="urn:swift:snl:ns.Sw"
xmlns:SwInt="urn:swift:snl:ns.SwInt"
xmlns:SwGbl="urn:swift:snl:ns.SwGbl"
xmlns:SwSec="urn:swift:snl:ns.SwSec">
<Saa:Revision>2.0.12</Saa:Revision>
<Saa:Header>
<Saa:Message>
<Saa:SenderReference>OCMBCHKHHXXX008$221017314942</Saa:SenderReference>
<Saa:MessageIdentifier>pacs.008.001.08</Saa:MessageIdentifier>
<Saa:Format>MX</Saa:Format>
<Saa:SubFormat>Output</Saa:SubFormat>
<Saa:Sender>
<Saa:DN>ou=xxx,o=cmbchkhh,o=swift</Saa:DN>
<Saa:FullName>
<Saa:X1>CMBCHKHHXXX</Saa:X1>
<Saa:X2>xxx</Saa:X2>
</Saa:FullName>
</Saa:Sender>
<Saa:Receiver>
<Saa:DN>ou=xxx,o=cmbchkhh,o=swift</Saa:DN>
<Saa:FullName>
<Saa:X1>CMBCHKHHXXX</Saa:X1>
<Saa:X2>xxx</Saa:X2>
</Saa:FullName>
</Saa:Receiver>
<Saa:InterfaceInfo>
<Saa:MessageCreator>SWIFTNetInterface</Saa:MessageCreator>
<Saa:MessageContext>Copy</Saa:MessageContext>
<Saa:MessageNature>Financial</Saa:MessageNature>
<Saa:Sumid>1CB2E95AFFFB31C1</Saa:Sumid>
<Saa:ServiceURI>mp/mx/_ImGiIFKDEeyXX57HMRFmxw</Saa:ServiceURI>
<Saa:MessageTypeURI>mp/mx/_ImGiIFKDEeyXX57HMRFmxw/_XC3TFV9CEeyfdsiuljUhuQ</Saa:MessageTypeURI>
</Saa:InterfaceInfo>
<Saa:NetworkInfo>
<Saa:Priority>Normal</Saa:Priority>
<Saa:IsPossibleDuplicate>false</Saa:IsPossibleDuplicate>
<Saa:Service>swift.finplus!pf</Saa:Service>
<Saa:Network>SWIFTNet</Saa:Network>
<Saa:SessionNr>000009</Saa:SessionNr>
<Saa:SeqNr>000000016</Saa:SeqNr>
<Saa:TransactionData>
<Saa:TransactionDataResult>Success</Saa:TransactionDataResult>
</Saa:TransactionData>
<Saa:SWIFTNetNetworkInfo>
<Saa:RequestType>pacs.008.001.08</Saa:RequestType>
<Saa:RequestSubtype>swift.cbprplus.02</Saa:RequestSubtype>
<Saa:SWIFTRef>swi99998-2022-10-17T08:43:16.0021.097225Z</Saa:SWIFTRef>
<Saa:SNLRef>SNL99998-2022-10-17T08:43:16.1.055059Z</Saa:SNLRef>
<Saa:Reference>0e801eb0-4df7-41ed-926a-cd4accb10755</Saa:Reference>
<Saa:SnFQueueName>cmbchkhh_finplusfut!p</Saa:SnFQueueName>
<Saa:SnFInputTime>0301:2022-10-17T08:43:16</Saa:SnFInputTime>
<Saa:SnFDeliveryTime>2022-10-17T08:43:17Z</Saa:SnFDeliveryTime>
<Saa:ValidationDescriptor>
<SwInt:ValResult>Success</SwInt:ValResult>
</Saa:ValidationDescriptor>
</Saa:SWIFTNetNetworkInfo>
</Saa:NetworkInfo>
<Saa:SecurityInfo>
<Saa:SWIFTNetSecurityInfo>
<Saa:SignatureResult>Success</Saa:SignatureResult>
<Saa:SignatureValue>
<SwSec:Signature>
<SwSec:SignedInfo>
<Sw:Reference>
<Sw:DigestValue>ymflJe6pUxOtYgrhgfQ2U1mMBPqRCzvQblHARkNoX5I=</Sw:DigestValue>
</Sw:Reference>
</SwSec:SignedInfo>
<SwSec:KeyInfo>
<SwSec:SignDN>cn=%52,cn=test,ou=transaction-signing,ou=transactionmanager,o=swift,o=swift</SwSec:SignDN>
<SwSec:CertPolicyId>1.3.21.6.3.10.200.4</SwSec:CertPolicyId>
</SwSec:KeyInfo>
<SwSec:Manifest>
<Sw:Reference>
<Sw:DigestRef>TRD</Sw:DigestRef>
<Sw:DigestValue>DWH/7ilKAtPS9bspbpgbdJQF8OrXzDFnp/eD3XBDiVQ=</Sw:DigestValue>
</Sw:Reference>
<Sw:Reference>
<Sw:DigestRef>Sw.IARequestHeader</Sw:DigestRef>
<Sw:DigestValue>YYuEhq87mz43SUkoKHxE7XtIUIn+0jhA9AdpHTNBteM=</Sw:DigestValue>
</Sw:Reference>
<Sw:Reference>
<Sw:DigestRef>Sw.RequestPayload and RND</Sw:DigestRef>
<Sw:DigestValue>sU2ZKVO4UidmF0YywUaOewTjraXfMr4CvWmKyYhhxmY=</Sw:DigestValue>
</Sw:Reference>
</SwSec:Manifest>
<Sw:Object>
<Sw:RND>Z1x9YSJYfVMkOWtORlwyUCpiJEw=</Sw:RND>
</Sw:Object>
</SwSec:Signature>
<SwSec:Signature>
<SwSec:SignedInfo>
<Sw:Reference>
<Sw:DigestValue>O1FQ7Tb5I+SdtMt2G2xWD3EBzu2YAa0SSVuM8MZxVPk=</Sw:DigestValue>
</Sw:Reference>
</SwSec:SignedInfo>
<SwSec:KeyInfo>
<SwSec:SignDN>cn=%11,cn=sfm,o=swift,o=swift</SwSec:SignDN>
<SwSec:CertPolicyId>1.3.21.6.3.10.100.3</SwSec:CertPolicyId>
</SwSec:KeyInfo>
<SwSec:Manifest>
<Sw:Reference>
<Sw:DigestRef>TRD</Sw:DigestRef>
<Sw:DigestValue>DWH/7ilKAtPS9bspbpgbdJQF8OrXzDFnp/eD3XBDiVQ=</Sw:DigestValue>
</Sw:Reference>
<Sw:Reference>
<Sw:DigestRef>Sw.IARequestHeader</Sw:DigestRef>
<Sw:DigestValue>YYuEhq87mz43SUkoKHxE7XtIUIn+0jhA9AdpHTNBteM=</Sw:DigestValue>
</Sw:Reference>
<Sw:Reference>
<Sw:DigestRef>Sw.RequestPayload and RND</Sw:DigestRef>
<Sw:DigestValue>sU2ZKVO4UidmF0YywUaOewTjraXfMr4CvWmKyYhhxmY=</Sw:DigestValue>
</Sw:Reference>
<Sw:Reference>
<Sw:DigestRef>Translated MT</Sw:DigestRef>
<Sw:DigestValue>PL2jzrp1W2suUG2Rs6U2BUxEfB4hkyJsyKSKRxBqKx8=</Sw:DigestValue>
</Sw:Reference>
</SwSec:Manifest>
<Sw:Object>
<Sw:RND>Z1x9YSJYfVMkOWtORlwyUCpiJEw=</Sw:RND>
</Sw:Object>
</SwSec:Signature>
</Saa:SignatureValue>
</Saa:SWIFTNetSecurityInfo>
</Saa:SecurityInfo>
<Saa:ExpiryDateTime>20221106084318</Saa:ExpiryDateTime>
</Saa:Message>
</Saa:Header>
<Saa:Body>
<head:AppHdr
xmlns:head="urn:iso:std:iso:20022:tech:xsd:head.001.001.02">
<head:Fr>
<head:FIId>
<head:FinInstnId>
<head:BICFI>CMBCHKHHXXX</head:BICFI>
</head:FinInstnId>
</head:FIId>
</head:Fr>
<head:To>
<head:FIId>
<head:FinInstnId>
<head:BICFI>CMBCHKHHXXX</head:BICFI>
</head:FinInstnId>
</head:FIId>
</head:To>
<head:BizMsgIdr>CMBCHKHHXXX20221017SAA0000000011CB4</head:BizMsgIdr>
<head:MsgDefIdr>pacs.008.001.08</head:MsgDefIdr>
<head:BizSvc>swift.cbprplus.02</head:BizSvc>
<head:CreDt>2022-10-17T16:32:24+00:00</head:CreDt>
</head:AppHdr>
<pacs:Document
xmlns:pacs="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
<pacs:FIToFICstmrCdtTrf>
<pacs:GrpHdr>
<pacs:MsgId>CMBCHKHHXXX20221017SAA0000000011CB4</pacs:MsgId>
<pacs:CreDtTm>2022-10-17T16:32:19+00:00</pacs:CreDtTm>
<pacs:NbOfTxs>1</pacs:NbOfTxs>
<pacs:SttlmInf>
<pacs:SttlmMtd>INDA</pacs:SttlmMtd>
</pacs:SttlmInf>
</pacs:GrpHdr>
<pacs:CdtTrfTxInf>
<pacs:PmtId>
<pacs:InstrId>20221017UAT-0003</pacs:InstrId>
<pacs:EndToEndId>NOTPROVIDED</pacs:EndToEndId>
<pacs:TxId>20221017UAT-0003</pacs:TxId>
<pacs:UETR>58aa6cae-b066-42e3-8427-e83905e3df65</pacs:UETR>
</pacs:PmtId>
<pacs:IntrBkSttlmAmt Ccy="USD">141414.</pacs:IntrBkSttlmAmt>
<pacs:IntrBkSttlmDt>2022-10-17</pacs:IntrBkSttlmDt>
<pacs:InstdAmt Ccy="USD">141414.</pacs:InstdAmt>
<pacs:ChrgBr>SHAR</pacs:ChrgBr>
<pacs:InstgAgt>
<pacs:FinInstnId>
<pacs:BICFI>CMBCHKHHXXX</pacs:BICFI>
</pacs:FinInstnId>
</pacs:InstgAgt>
<pacs:InstdAgt>
<pacs:FinInstnId>
<pacs:BICFI>CMBCHKHHXXX</pacs:BICFI>
</pacs:FinInstnId>
</pacs:InstdAgt>
<pacs:Dbtr>
<pacs:Nm>ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO R</pacs:Nm>
<pacs:PstlAdr>
<pacs:AdrLine>896 RD HK </pacs:AdrLine>
</pacs:PstlAdr>
</pacs:Dbtr>
<pacs:DbtrAcct>
<pacs:Id>
<pacs:Othr>
<pacs:Id>9966332120055222222222222222222226</pacs:Id>
</pacs:Othr>
</pacs:Id>
</pacs:DbtrAcct>
<pacs:DbtrAgt>
<pacs:FinInstnId>
<pacs:BICFI>CMBCHKHHXXX</pacs:BICFI>
</pacs:FinInstnId>
</pacs:DbtrAgt>
<pacs:CdtrAgt>
<pacs:FinInstnId>
<pacs:BICFI>CMBCHKHHXXX</pacs:BICFI>
</pacs:FinInstnId>
</pacs:CdtrAgt>
<pacs:Cdtr>
<pacs:Nm>ZIDONG ER</pacs:Nm>
<pacs:PstlAdr>
<pacs:AdrLine>444 RD HK </pacs:AdrLine>
</pacs:PstlAdr>
</pacs:Cdtr>
<pacs:CdtrAcct>
<pacs:Id>
<pacs:Othr>
<pacs:Id>8603923380</pacs:Id>
</pacs:Othr>
</pacs:Id>
</pacs:CdtrAcct>
<pacs:RmtInf>
<pacs:Ustrd>PYMT 2</pacs:Ustrd>
</pacs:RmtInf>
</pacs:CdtTrfTxInf>
</pacs:FIToFICstmrCdtTrf>
</pacs:Document>
</Saa:Body>
</Saa:DataPDU>
测试输出结果
执行下列语句,仔细观察无命名空间前缀的xmlStringNoPrefix和有命名空间前缀的xmlStringPrefix的输出结果。
public static void main(String[] args) {
String xmlStringNoPrefix = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Saa:DataPDU xmlns:Saa=\"urn:swift:saa:xsd:saa.2.0\" xmlns:Sw=\"urn:swift:snl:ns.Sw\" xmlns:SwInt=\"urn:swift:snl:ns.SwInt\" xmlns:SwGbl=\"urn:swift:snl:ns.SwGbl\" xmlns:SwSec=\"urn:swift:snl:ns.SwSec\"><Saa:Revision>2.0.12</Saa:Revision><Saa:Header><Saa:Message><Saa:SenderReference>IABOCAU2SXXX056$2211087869545</Saa:SenderReference><Saa:MessageIdentifier>camt.056.001.09</Saa:MessageIdentifier><Saa:Format>MX</Saa:Format><Saa:SubFormat>Input</Saa:SubFormat><Saa:Sender><Saa:DN>ou=xxx,o=cmbcau2s,o=swift</Saa:DN><Saa:FullName><Saa:X1>CMBCAU2SXXX</Saa:X1><Saa:X2>xxx</Saa:X2></Saa:FullName></Saa:Sender><Saa:Receiver><Saa:DN>ou=xxx,o=abocau2s,o=swift</Saa:DN><Saa:FullName><Saa:X1>ABOCAU2SXXX</Saa:X1><Saa:X2>xxx</Saa:X2></Saa:FullName></Saa:Receiver><Saa:InterfaceInfo><Saa:UserReference>ASOO016FV000001</Saa:UserReference></Saa:InterfaceInfo><Saa:NetworkInfo><Saa:Priority>Normal</Saa:Priority><Saa:IsPossibleDuplicate>false</Saa:IsPossibleDuplicate><Saa:Service>apn.hvcs</Saa:Service><Saa:SWIFTNetNetworkInfo><Saa:RequestType>camt.056.001.09</Saa:RequestType><Saa:Reference>0fac415a-5efb-41ed-a5b3-83f118d8e998</Saa:Reference></Saa:SWIFTNetNetworkInfo></Saa:NetworkInfo><Saa:ExpiryDateTime>20221128001951</Saa:ExpiryDateTime></Saa:Message></Saa:Header><Saa:Body><AppHdr xmlns=\"urn:iso:std:iso:20022:tech:xsd:head.001.001.02\"><Fr><FIId><FinInstnId><BICFI>CMBCAU2SXXX</BICFI></FinInstnId></FIId></Fr><To><FIId><FinInstnId><BICFI>ABOCAU2SXXX</BICFI></FinInstnId></FIId></To><BizMsgIdr>CMBCAU2SXXX20221108SA00000000001HV0</BizMsgIdr><MsgDefIdr>CAMTTEST20221108002</MsgDefIdr><BizSvc>apn.hvcs.01</BizSvc><CreDt>2022-11-08T17:20:00+10:00</CreDt></AppHdr><Document xmlns=\"urn:iso:std:iso:20022:tech:xsd:camt.056.001.09\"><FIToFIPmtCxlReq><Assgnmt><Id>CMBCAU2SXXX20221108SA00000000001HV0</Id><Assgnr><Agt><FinInstnId><BICFI>CMBCAU2SXXX</BICFI></FinInstnId></Agt></Assgnr><Assgne><Agt><FinInstnId><BICFI>ABOCAU2SXXX</BICFI></FinInstnId></Agt></Assgne><CreDtTm>2022-11-08T17:20:00+10:00</CreDtTm></Assgnmt><Undrlyg><OrgnlGrpInfAndCxl><OrgnlMsgId>PACS009TESTABOC</OrgnlMsgId><OrgnlMsgNmId>PACS.009.001.01</OrgnlMsgNmId><OrgnlCreDtTm>2022-11-04T17:20:00+10:00</OrgnlCreDtTm><CxlRsnInf><Rsn><Cd>UPAY</Cd></Rsn></CxlRsnInf></OrgnlGrpInfAndCxl></Undrlyg></FIToFIPmtCxlReq></Document></Saa:Body></Saa:DataPDU>";
// containsCurrentLabel为true, 查询节点为枝干节点,输出结果包含Document节点
System.out.println(getDocumentNodeValue(xmlStringNoPrefix, "Document", true, "", ""));
// containsCurrentLabel为false, 查询节点为枝干节点,输出结果不包含Document节点
System.out.println(getDocumentNodeValue(xmlStringNoPrefix, "Document", false, "", ""));
// containsCurrentLabel为true, 查询节点为枝干节点,输出结果包含FIToFICstmrCdtTrf节点
System.out.println(getDocumentNodeValue(xmlStringNoPrefix, "FIToFIPmtCxlReq", true, "", ""));
// containsCurrentLabel为false, 查询节点为枝干节点,输出结果不包含FIToFICstmrCdtTrf节点
System.out.println(getDocumentNodeValue(xmlStringNoPrefix, "FIToFIPmtCxlReq", false, "", ""));
// 查询节点为叶子节点, parentNodeName没传值,不校验CreDtTm的直接父节点。replaceStr有值,CreDtTm节点的值替换为replaceStr的值
System.out.println(getDocumentNodeValue(xmlStringNoPrefix, "CreDtTm", false, "", "2022-10-24T12:00:00+00:00"));
// 查询节点为叶子节点, parentNodeName有值,校验CreDtTm的直接父节点是否是GrpHdr,不是则跳过进行下一个循环。replaceStr无值,不替换CreDtTm的值,直接输出CreDtTm的值。
System.out.println(getDocumentNodeValue(xmlStringNoPrefix, "CreDtTm", false, "GrpHdr", ""));
String xmlStringPrefix = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Saa:DataPDU xmlns:Saa=\"urn:swift:saa:xsd:saa.2.0\" xmlns:Sw=\"urn:swift:snl:ns.Sw\" xmlns:SwInt=\"urn:swift:snl:ns.SwInt\" xmlns:SwGbl=\"urn:swift:snl:ns.SwGbl\" xmlns:SwSec=\"urn:swift:snl:ns.SwSec\"><Saa:Revision>2.0.12</Saa:Revision><Saa:Header><Saa:Message><Saa:SenderReference>OCMBCHKHHXXX008$221017314942</Saa:SenderReference><Saa:MessageIdentifier>pacs.008.001.08</Saa:MessageIdentifier><Saa:Format>MX</Saa:Format><Saa:SubFormat>Output</Saa:SubFormat><Saa:Sender><Saa:DN>ou=xxx,o=cmbchkhh,o=swift</Saa:DN><Saa:FullName><Saa:X1>CMBCHKHHXXX</Saa:X1><Saa:X2>xxx</Saa:X2></Saa:FullName></Saa:Sender><Saa:Receiver><Saa:DN>ou=xxx,o=cmbchkhh,o=swift</Saa:DN><Saa:FullName><Saa:X1>CMBCHKHHXXX</Saa:X1><Saa:X2>xxx</Saa:X2></Saa:FullName></Saa:Receiver><Saa:InterfaceInfo><Saa:MessageCreator>SWIFTNetInterface</Saa:MessageCreator><Saa:MessageContext>Copy</Saa:MessageContext><Saa:MessageNature>Financial</Saa:MessageNature><Saa:Sumid>1CB2E95AFFFB31C1</Saa:Sumid><Saa:ServiceURI>mp/mx/_ImGiIFKDEeyXX57HMRFmxw</Saa:ServiceURI><Saa:MessageTypeURI>mp/mx/_ImGiIFKDEeyXX57HMRFmxw/_XC3TFV9CEeyfdsiuljUhuQ</Saa:MessageTypeURI></Saa:InterfaceInfo><Saa:NetworkInfo><Saa:Priority>Normal</Saa:Priority><Saa:IsPossibleDuplicate>false</Saa:IsPossibleDuplicate><Saa:Service>swift.finplus!pf</Saa:Service><Saa:Network>SWIFTNet</Saa:Network><Saa:SessionNr>000009</Saa:SessionNr><Saa:SeqNr>000000016</Saa:SeqNr><Saa:TransactionData><Saa:TransactionDataResult>Success</Saa:TransactionDataResult></Saa:TransactionData><Saa:SWIFTNetNetworkInfo><Saa:RequestType>pacs.008.001.08</Saa:RequestType><Saa:RequestSubtype>swift.cbprplus.02</Saa:RequestSubtype><Saa:SWIFTRef>swi99998-2022-10-17T08:43:16.0021.097225Z</Saa:SWIFTRef><Saa:SNLRef>SNL99998-2022-10-17T08:43:16.1.055059Z</Saa:SNLRef><Saa:Reference>0e801eb0-4df7-41ed-926a-cd4accb10755</Saa:Reference><Saa:SnFQueueName>cmbchkhh_finplusfut!p</Saa:SnFQueueName><Saa:SnFInputTime>0301:2022-10-17T08:43:16</Saa:SnFInputTime><Saa:SnFDeliveryTime>2022-10-17T08:43:17Z</Saa:SnFDeliveryTime><Saa:ValidationDescriptor><SwInt:ValResult>Success</SwInt:ValResult></Saa:ValidationDescriptor></Saa:SWIFTNetNetworkInfo></Saa:NetworkInfo><Saa:SecurityInfo><Saa:SWIFTNetSecurityInfo><Saa:SignatureResult>Success</Saa:SignatureResult><Saa:SignatureValue><SwSec:Signature><SwSec:SignedInfo><Sw:Reference><Sw:DigestValue>ymflJe6pUxOtYgrhgfQ2U1mMBPqRCzvQblHARkNoX5I=</Sw:DigestValue></Sw:Reference></SwSec:SignedInfo><SwSec:KeyInfo><SwSec:SignDN>cn=%52,cn=test,ou=transaction-signing,ou=transactionmanager,o=swift,o=swift</SwSec:SignDN><SwSec:CertPolicyId>1.3.21.6.3.10.200.4</SwSec:CertPolicyId></SwSec:KeyInfo><SwSec:Manifest><Sw:Reference><Sw:DigestRef>TRD</Sw:DigestRef><Sw:DigestValue>DWH/7ilKAtPS9bspbpgbdJQF8OrXzDFnp/eD3XBDiVQ=</Sw:DigestValue></Sw:Reference><Sw:Reference><Sw:DigestRef>Sw.IARequestHeader</Sw:DigestRef><Sw:DigestValue>YYuEhq87mz43SUkoKHxE7XtIUIn+0jhA9AdpHTNBteM=</Sw:DigestValue></Sw:Reference><Sw:Reference><Sw:DigestRef>Sw.RequestPayload and RND</Sw:DigestRef><Sw:DigestValue>sU2ZKVO4UidmF0YywUaOewTjraXfMr4CvWmKyYhhxmY=</Sw:DigestValue></Sw:Reference></SwSec:Manifest><Sw:Object><Sw:RND>Z1x9YSJYfVMkOWtORlwyUCpiJEw=</Sw:RND></Sw:Object></SwSec:Signature><SwSec:Signature><SwSec:SignedInfo><Sw:Reference><Sw:DigestValue>O1FQ7Tb5I+SdtMt2G2xWD3EBzu2YAa0SSVuM8MZxVPk=</Sw:DigestValue></Sw:Reference></SwSec:SignedInfo><SwSec:KeyInfo><SwSec:SignDN>cn=%11,cn=sfm,o=swift,o=swift</SwSec:SignDN><SwSec:CertPolicyId>1.3.21.6.3.10.100.3</SwSec:CertPolicyId></SwSec:KeyInfo><SwSec:Manifest><Sw:Reference><Sw:DigestRef>TRD</Sw:DigestRef><Sw:DigestValue>DWH/7ilKAtPS9bspbpgbdJQF8OrXzDFnp/eD3XBDiVQ=</Sw:DigestValue></Sw:Reference><Sw:Reference><Sw:DigestRef>Sw.IARequestHeader</Sw:DigestRef><Sw:DigestValue>YYuEhq87mz43SUkoKHxE7XtIUIn+0jhA9AdpHTNBteM=</Sw:DigestValue></Sw:Reference><Sw:Reference><Sw:DigestRef>Sw.RequestPayload and RND</Sw:DigestRef><Sw:DigestValue>sU2ZKVO4UidmF0YywUaOewTjraXfMr4CvWmKyYhhxmY=</Sw:DigestValue></Sw:Reference><Sw:Reference><Sw:DigestRef>Translated MT</Sw:DigestRef><Sw:DigestValue>PL2jzrp1W2suUG2Rs6U2BUxEfB4hkyJsyKSKRxBqKx8=</Sw:DigestValue></Sw:Reference></SwSec:Manifest><Sw:Object><Sw:RND>Z1x9YSJYfVMkOWtORlwyUCpiJEw=</Sw:RND></Sw:Object></SwSec:Signature></Saa:SignatureValue></Saa:SWIFTNetSecurityInfo></Saa:SecurityInfo><Saa:ExpiryDateTime>20221106084318</Saa:ExpiryDateTime></Saa:Message></Saa:Header><Saa:Body><head:AppHdr xmlns:head=\"urn:iso:std:iso:20022:tech:xsd:head.001.001.02\"><head:Fr><head:FIId><head:FinInstnId><head:BICFI>CMBCHKHHXXX</head:BICFI></head:FinInstnId></head:FIId></head:Fr><head:To><head:FIId><head:FinInstnId><head:BICFI>CMBCHKHHXXX</head:BICFI></head:FinInstnId></head:FIId></head:To><head:BizMsgIdr>CMBCHKHHXXX20221017SAA0000000011CB4</head:BizMsgIdr><head:MsgDefIdr>pacs.008.001.08</head:MsgDefIdr><head:BizSvc>swift.cbprplus.02</head:BizSvc><head:CreDt>2022-10-17T16:32:24+00:00</head:CreDt></head:AppHdr><pacs:Document xmlns:pacs=\"urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08\"><pacs:FIToFICstmrCdtTrf><pacs:GrpHdr><pacs:MsgId>CMBCHKHHXXX20221017SAA0000000011CB4</pacs:MsgId><pacs:CreDtTm>2022-10-17T16:32:19+00:00</pacs:CreDtTm><pacs:NbOfTxs>1</pacs:NbOfTxs><pacs:SttlmInf><pacs:SttlmMtd>INDA</pacs:SttlmMtd></pacs:SttlmInf></pacs:GrpHdr><pacs:CdtTrfTxInf><pacs:PmtId><pacs:InstrId>20221017UAT-0003</pacs:InstrId><pacs:EndToEndId>NOTPROVIDED</pacs:EndToEndId><pacs:TxId>20221017UAT-0003</pacs:TxId><pacs:UETR>58aa6cae-b066-42e3-8427-e83905e3df65</pacs:UETR></pacs:PmtId><pacs:IntrBkSttlmAmt Ccy=\"USD\">141414.</pacs:IntrBkSttlmAmt><pacs:IntrBkSttlmDt>2022-10-17</pacs:IntrBkSttlmDt><pacs:InstdAmt Ccy=\"USD\">141414.</pacs:InstdAmt><pacs:ChrgBr>SHAR</pacs:ChrgBr><pacs:InstgAgt><pacs:FinInstnId><pacs:BICFI>CMBCHKHHXXX</pacs:BICFI></pacs:FinInstnId></pacs:InstgAgt><pacs:InstdAgt><pacs:FinInstnId><pacs:BICFI>CMBCHKHHXXX</pacs:BICFI></pacs:FinInstnId></pacs:InstdAgt><pacs:Dbtr><pacs:Nm>ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO ROO CO LTD ROO R</pacs:Nm><pacs:PstlAdr><pacs:AdrLine>896 RD HK </pacs:AdrLine></pacs:PstlAdr></pacs:Dbtr><pacs:DbtrAcct><pacs:Id><pacs:Othr><pacs:Id>9966332120055222222222222222222226</pacs:Id></pacs:Othr></pacs:Id></pacs:DbtrAcct><pacs:DbtrAgt><pacs:FinInstnId><pacs:BICFI>CMBCHKHHXXX</pacs:BICFI></pacs:FinInstnId></pacs:DbtrAgt><pacs:CdtrAgt><pacs:FinInstnId><pacs:BICFI>CMBCHKHHXXX</pacs:BICFI></pacs:FinInstnId></pacs:CdtrAgt><pacs:Cdtr><pacs:Nm>ZIDONG ER</pacs:Nm><pacs:PstlAdr><pacs:AdrLine>444 RD HK </pacs:AdrLine></pacs:PstlAdr></pacs:Cdtr><pacs:CdtrAcct><pacs:Id><pacs:Othr><pacs:Id>8603923380</pacs:Id></pacs:Othr></pacs:Id></pacs:CdtrAcct><pacs:RmtInf><pacs:Ustrd>PYMT 2</pacs:Ustrd></pacs:RmtInf></pacs:CdtTrfTxInf></pacs:FIToFICstmrCdtTrf></pacs:Document></Saa:Body></Saa:DataPDU>";
// containsCurrentLabel为true, 查询节点为枝干节点,输出结果包含Document节点
System.out.println(getDocumentNodeValue(xmlStringPrefix, "Document", true, "", ""));
// containsCurrentLabel为false, 查询节点为枝干节点,输出结果不包含Document节点
System.out.println(getDocumentNodeValue(xmlStringPrefix, "Document", false, "", ""));
// containsCurrentLabel为true, 查询节点为枝干节点,输出结果包含FIToFICstmrCdtTrf节点
System.out.println(getDocumentNodeValue(xmlStringPrefix, "FIToFICstmrCdtTrf", true, "", ""));
// containsCurrentLabel为false, 查询节点为枝干节点,输出结果不包含FIToFICstmrCdtTrf节点
System.out.println(getDocumentNodeValue(xmlStringPrefix, "FIToFICstmrCdtTrf", false, "", ""));
// 查询节点为叶子节点, parentNodeName没传值,不校验CreDtTm的直接父节点。replaceStr有值,CreDtTm节点的值替换为replaceStr的值
System.out.println(getDocumentNodeValue(xmlStringPrefix, "CreDtTm", false, "", "2022-10-24T12:00:00+00:00"));
// 查询节点为叶子节点, parentNodeName有值,校验CreDtTm的直接父节点是否是GrpHdr,不是则跳过进行下一个循环。replaceStr无值,不替换CreDtTm的值,直接输出CreDtTm的值。
System.out.println(getDocumentNodeValue(xmlStringPrefix, "CreDtTm", false, "GrpHdr", ""));
}
如有问题请在下方留言,我会认真的查看每一条并尽量的给予回复。谢谢观看^^