美文网首页Java技术博客专栏
Dom4j解析xml复杂多节点报文

Dom4j解析xml复杂多节点报文

作者: 程序大视界 | 来源:发表于2018-12-15 20:51 被阅读0次

XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已。

XML的解析方式分为四种:

    1、DOM解析;

    2、SAX解析;

    3、JDOM解析;

    4、DOM4J解析。

其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。

本文介绍的是DOM4J方式解析。依赖jar包:

<dependency>

<groupId>dom4j</groupId>

<artifactId>dom4j</artifactId>

<version>1.6.1</version>

</dependency>

xml报文如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<Root>

    <SttlCntNb>2</SttlCntNb>

    <DebitCntAmt>CNY0.00</DebitCntAmt>

    <CreditCntAmt>CNY4700.00</CreditCntAmt>

    <SttlList>

        <SttlInf>

            <SttlReptFlg>2018052500170139</SttlReptFlg>

            <SttlDCFlg>2</SttlDCFlg>

            <SttlAmt>CNY100.00</SttlAmt>

            <BatchList>

                <BatchInf>

                    <BatchId>B201805230015</BatchId>

                    <BatchDCFlg>2</BatchDCFlg>

                    <BatchNetAmt>CNY100.00</BatchNetAmt>

                    <SubItemList>

                        <SubItemInf>0113|C3228644000018|04|CNY0.00|0|CNY5.00|1|</SubItemInf>

                        <SubItemInf>0120|C3228640000020|05|CNY50.00|1|CNY0.00|0|</SubItemInf>

                        <SubItemInf>0114|C3228640000029|07|CNY0.00|0|CNY5.00|1|</SubItemInf>

                        <SubItemInf>0115|C3228640000019|06|CNY0.00|0|CNY5.00|1|</SubItemInf>

                        <SubItemInf>0111|C3228640000016|03|CNY0.00|0|CNY10.00|1|</SubItemInf>

                        <SubItemInf>0110|C3228644000016|01|CNY0.00|0|CNY110.00|1|</SubItemInf>

                        <SubItemInf>0112|C3228644000017|99|CNY0.00|0|CNY5.00|1|</SubItemInf>

                        <SubItemInf>0110|C3228644000016|02|CNY0.00|0|CNY10.00|1|</SubItemInf>

                    </SubItemList>

                </BatchInf>

            </BatchList>

        </SttlInf>

        <SttlInf>

            <SttlReptFlg>2018052500170138</SttlReptFlg>

            <SttlDCFlg>2</SttlDCFlg>

            <SttlAmt>CNY4600.00</SttlAmt>

            <BatchList>

                <BatchInf>

                    <BatchId>B201805240001</BatchId>

                    <BatchDCFlg>2</BatchDCFlg>

                    <BatchNetAmt>CNY400.00</BatchNetAmt>

                    <SubItemList>

                        <SubItemInf>0126|C1010511003703|00|CNY0.00|4|CNY0.00|0|</SubItemInf>

                        <SubItemInf>0125|C1010211000012|01|CNY0.00|8|CNY0.00|0|</SubItemInf>

                        <SubItemInf>0126|C1010211000012|01|CNY0.00|8|CNY0.00|0|</SubItemInf>

                        <SubItemInf>0124|C1010211000012|01|CNY0.00|8|CNY0.00|0|</SubItemInf>

                        <SubItemInf>0123|C1010211000012|01|CNY0.00|4|CNY0.00|0|</SubItemInf>

                        <SubItemInf>0110|C1010211000012|01|CNY0.00|0|CNY400.00|2|</SubItemInf>

                    </SubItemList>

                </BatchInf>

                <BatchInf>

                    <BatchId>B201805240002</BatchId>

                    <BatchDCFlg>2</BatchDCFlg>

                    <BatchNetAmt>CNY400.00</BatchNetAmt>

                    <SubItemList>

                        <SubItemInf>0125|C1010211000012|00|CNY400.00|4|CNY0.00|0|</SubItemInf>

                        <SubItemInf>0110|C1010211000012|00|CNY0.00|0|CNY800.00|2|</SubItemInf>

                    </SubItemList>

                </BatchInf>

                <BatchInf>

                    <BatchId>B201805240003</BatchId>

                    <BatchDCFlg>1</BatchDCFlg>

                    <BatchNetAmt>CNY0.00</BatchNetAmt>

                    <SubItemList>

                        <SubItemInf>0120|C1010211000012|00|CNY0.00|4|CNY0.00|0|</SubItemInf>

                    </SubItemList>

                </BatchInf>

                <BatchInf>

                    <BatchId>B201805240004</BatchId>

                    <BatchDCFlg>2</BatchDCFlg>

                    <BatchNetAmt>CNY1200.00</BatchNetAmt>

                    <SubItemList>

                        <SubItemInf>0112|C1010211000012|01|CNY0.00|0|CNY1200.00|2|</SubItemInf>

                    </SubItemList>

                </BatchInf>

                <BatchInf>

                    <BatchId>B201805240005</BatchId>

                    <BatchDCFlg>2</BatchDCFlg>

                    <BatchNetAmt>CNY400.00</BatchNetAmt>

                    <SubItemList>

                        <SubItemInf>0113|C1010211000012|00|CNY0.00|0|CNY400.00|4|</SubItemInf>

                    </SubItemList>

                </BatchInf>

                <BatchInf>

                    <BatchId>B201805240006</BatchId>

                    <BatchDCFlg>2</BatchDCFlg>

                    <BatchNetAmt>CNY400.00</BatchNetAmt>

                    <SubItemList>

                        <SubItemInf>0114|C1010211000012|00|CNY0.00|0|CNY400.00|4|</SubItemInf>

                    </SubItemList>

                </BatchInf>

                <BatchInf>

                    <BatchId>B201805240007</BatchId>

                    <BatchDCFlg>2</BatchDCFlg>

                    <BatchNetAmt>CNY200.00</BatchNetAmt>

                    <SubItemList>

                        <SubItemInf>0115|C1010211000012|01|CNY0.00|0|CNY200.00|2|</SubItemInf>

                    </SubItemList>

                </BatchInf>

                <BatchInf>

                    <BatchId>B201805240008</BatchId>

                    <BatchDCFlg>2</BatchDCFlg>

                    <BatchNetAmt>CNY600.00</BatchNetAmt>

                    <SubItemList>

                        <SubItemInf>0115|C1010211000012|01|CNY0.00|0|CNY600.00|2|</SubItemInf>

                    </SubItemList>

                </BatchInf>

                <BatchInf>

                    <BatchId>B201805240009</BatchId>

                    <BatchDCFlg>2</BatchDCFlg>

                    <BatchNetAmt>CNY400.00</BatchNetAmt>

                    <SubItemList>

                        <SubItemInf>0110|C1010511003703|00|CNY0.00|0|CNY400.00|2|</SubItemInf>

                    </SubItemList>

                </BatchInf>

                <BatchInf>

                    <BatchId>B201805240010</BatchId>

                    <BatchDCFlg>2</BatchDCFlg>

                    <BatchNetAmt>CNY1200.00</BatchNetAmt>

                    <SubItemList>

                        <SubItemInf>0111|C1010211000012|01|CNY0.00|0|CNY1200.00|4|</SubItemInf>

                    </SubItemList>

                </BatchInf>

                <BatchInf>

                    <BatchId>B201805240012</BatchId>

                    <BatchDCFlg>1</BatchDCFlg>

                    <BatchNetAmt>CNY1200.00</BatchNetAmt>

                    <SubItemList>

                        <SubItemInf>0116|C1010511003703|00|CNY1200.00|4|CNY0.00|0|</SubItemInf>

                    </SubItemList>

                </BatchInf>

            </BatchList>

        </SttlInf>

    </SttlList>

</Root>

主要核心代码如下:

String saveFile 为本地保存xml报文的路径。

AccountInfoEntityResp  为解析xml后封装的obj实体对象。

/**

    * 解析xml文件并

    */

    public String Dom4jGetXML(String saveFile){

        //返回的Entity对象

        String xmlContents = new String();

        // 创建SAXReader的对象reader

        SAXReader reader = new SAXReader();

        try {

//            Resource resource = new ClassPathResource("accountInfo/"+accountDate+".xml");

            Resource resource = new ClassPathResource(saveFile);

            File file = null;

            try{

                file = resource.getFile();

            }catch (Exception e){

                //抛出异常

            }

            // 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。

            Document document = reader.read(file);

            // 通过document对象获取根节点bookstore

            Element rootElement = document.getRootElement();

            //document转换为String字符串

            xmlContents  = document.asXML();

            //解析xml文件并转换为obj

        } catch (DocumentException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        return xmlContents;

    }

/**

    * 解析对账文件xml,转换为obj对象返回前段

    * @Descriptions: 循环遍历所有子节点,保存每个节点的值

    * @Return: AccountInfoEntity

    */

    public AccountInfoEntityResp getNodes(Element node){

        AccountInfoEntityResp accountInfoEntityResp = new AccountInfoEntityResp();

        List<SttlInf> SttlList = new ArrayList<SttlInf>();

        //获得指定节点下面的子节点,首先要知道自己要操作的节点。

        Element SttlCntNbElem = node.element("SttlCntNb");

        //获取SttlCntNb

        String SttlCntNb = SttlCntNbElem.getTextTrim();

        //获取DebitCntAmt

        Element DebitCntAmtElem = node.element("DebitCntAmt");

        String DebitCntAmt = DebitCntAmtElem.getTextTrim();

        //获取CreditCntAmt

        Element CreditCntAmtElem = node.element("CreditCntAmt");

        String CreditCntAmt = CreditCntAmtElem.getTextTrim();

        accountInfoEntityResp.setSttlCntNb(Integer.valueOf(SttlCntNb));

        BigDecimal CreditCntAmtVal = null;

        if(CreditCntAmt != null && !CreditCntAmt.isEmpty()){

            CreditCntAmtVal = new BigDecimal(CreditCntAmt.replace("CNY", ""));

        }

        accountInfoEntityResp.setCreditCntAmt(CreditCntAmtVal);

        BigDecimal DebitCntAmtval = null;

        if(DebitCntAmt != null && !DebitCntAmt.isEmpty()){

            DebitCntAmtval = new BigDecimal(DebitCntAmt.replace("CNY", ""));

        }

        accountInfoEntityResp.setDebitCntAmt(DebitCntAmtval);

        //获取SttlList

        Element SttlListEle = node.element("SttlList");

        //获取SttlInf

        Element SttlInfEle = SttlListEle.element("SttlInf");

        List<Element> SttlInfList = SttlListEle.elements();

        //遍历SttlInfList节点

        String SttlReptFlg  = "";

        Integer SttlDCFlg = null;

        BigDecimal SttlAmt = null;

        for(Element e : SttlInfList){

            List<BatchInf> BatchList = new ArrayList<BatchInf>();

            SttlInf sttlInf = new SttlInf();

            //SttlInf下的子节点

            Element SttlReptFlgEle = e.element("SttlReptFlg");

            SttlReptFlg = SttlReptFlgEle.getTextTrim();

            Element SttlDCFlgEle = e.element("SttlDCFlg");

            SttlDCFlg = Integer.valueOf(SttlDCFlgEle.getTextTrim());

            Element SttlAmtEle = e.element("SttlAmt");

            SttlAmt = new BigDecimal(SttlAmtEle.getTextTrim().replace("CNY", ""));

            //设值

            sttlInf.setSttlAmt(SttlAmt);

            sttlInf.setSttlDCFlg(SttlDCFlg);

            sttlInf.setSttlReptFlg(SttlReptFlg);

            //获取BatchList节点

            Element BatchListEle = e.element("BatchList");

            //获取BatchInf

            List<Element> BatchInfList = BatchListEle.elements();

            for(Element e2 : BatchInfList){

                List<SubItemInf> SubItemList = new ArrayList<SubItemInf>();

                BatchInf batchInf = new BatchInf();

                String BatchId = "";

                Integer BatchDCFlg = null;

                BigDecimal BatchNetAmt = null;

                Element BatchIdEle = e2.element("BatchId");

                BatchId = BatchIdEle.getTextTrim();

                Element BatchDCFlgEle = e2.element("BatchDCFlg");

                BatchDCFlg = Integer.valueOf(BatchDCFlgEle.getTextTrim());

                Element BatchNetAmtEle = e2.element("BatchNetAmt");

                BatchNetAmt = new BigDecimal(BatchNetAmtEle.getTextTrim().replace("CNY", ""));

                batchInf.setBatchDCFlg(BatchDCFlg);

                batchInf.setBatchId(BatchId);

                batchInf.setBatchNetAmt(BatchNetAmt);

                //获取SubItemList节点

                Element SubItemListEle = e2.element("SubItemList");

                //获取BatchInf

                List<Element> SubItemInfList = SubItemListEle.elements();

                for(Element e3 : SubItemInfList){

                    SubItemInf subItemInf = new SubItemInf();

                    String subItem = "";

                    subItem = e3.getTextTrim().replace("CNY", "");

                    subItemInf.setSubItemInf(subItem);

                    SubItemList.add(subItemInf);

                }

                batchInf.setSubItemList(SubItemList);

                BatchList.add(batchInf);

            }

            sttlInf.setBatchList(BatchList);

            SttlList.add(sttlInf);

        }

        accountInfoEntityResp.setSttlList(SttlList);

        return accountInfoEntityResp;

    }

以上:有疑问或建议欢迎指出更正。感谢分享!

关注个人技术公众号:nick_coding1024

不定期分享最新前沿技术框架和bat大厂常用技术等,加群不定期分享行业内大牛直播讲课以及获得内退一线互联网公司机会。

---------------------CSDN技术博客

原文:https://blog.csdn.net/xuri24/article/details/83113340

相关文章

本文标题:Dom4j解析xml复杂多节点报文

本文链接:https://www.haomeiwen.com/subject/qqczhqtx.html