Dom4j解析xml复杂多节点报文

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容