Dom4j解析xml获取枝干节点内容或叶子节点值, 或可替换叶子节点值

前言

日常工作中有解析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", ""));

    }

如有问题请在下方留言,我会认真的查看每一条并尽量的给予回复。谢谢观看^^

猜你喜欢

转载自blog.csdn.net/Damon_Cheung/article/details/127996743