Dom4j解析xml复杂多节点报文

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

XML的解析方式分为四种:

    1、DOM解析;

    2、SAX解析;

    3、JDOM解析;

    4、DOM4J解析。

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

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

		
			dom4j
			dom4j
			1.6.1
		

xml报文如下:



    2
    CNY0.00
    CNY4700.00
    
        
            2018052500170139
            2
            CNY100.00
            
                
                    B201805230015
                    2
                    CNY100.00
                    
                        0113|C3228644000018|04|CNY0.00|0|CNY5.00|1|
                        0120|C3228640000020|05|CNY50.00|1|CNY0.00|0|
                        0114|C3228640000029|07|CNY0.00|0|CNY5.00|1|
                        0115|C3228640000019|06|CNY0.00|0|CNY5.00|1|
                        0111|C3228640000016|03|CNY0.00|0|CNY10.00|1|
                        0110|C3228644000016|01|CNY0.00|0|CNY110.00|1|
                        0112|C3228644000017|99|CNY0.00|0|CNY5.00|1|
                        0110|C3228644000016|02|CNY0.00|0|CNY10.00|1|
                    
                
            
        
        
            2018052500170138
            2
            CNY4600.00
            
                
                    B201805240001
                    2
                    CNY400.00
                    
                        0126|C1010511003703|00|CNY0.00|4|CNY0.00|0|
                        0125|C1010211000012|01|CNY0.00|8|CNY0.00|0|
                        0126|C1010211000012|01|CNY0.00|8|CNY0.00|0|
                        0124|C1010211000012|01|CNY0.00|8|CNY0.00|0|
                        0123|C1010211000012|01|CNY0.00|4|CNY0.00|0|
                        0110|C1010211000012|01|CNY0.00|0|CNY400.00|2|
                    
                
                
                    B201805240002
                    2
                    CNY400.00
                    
                        0125|C1010211000012|00|CNY400.00|4|CNY0.00|0|
                        0110|C1010211000012|00|CNY0.00|0|CNY800.00|2|
                    
                
                
                    B201805240003
                    1
                    CNY0.00
                    
                        0120|C1010211000012|00|CNY0.00|4|CNY0.00|0|
                    
                
                
                    B201805240004
                    2
                    CNY1200.00
                    
                        0112|C1010211000012|01|CNY0.00|0|CNY1200.00|2|
                    
                
                
                    B201805240005
                    2
                    CNY400.00
                    
                        0113|C1010211000012|00|CNY0.00|0|CNY400.00|4|
                    
                
                
                    B201805240006
                    2
                    CNY400.00
                    
                        0114|C1010211000012|00|CNY0.00|0|CNY400.00|4|
                    
                
                
                    B201805240007
                    2
                    CNY200.00
                    
                        0115|C1010211000012|01|CNY0.00|0|CNY200.00|2|
                    
                
                
                    B201805240008
                    2
                    CNY600.00
                    
                        0115|C1010211000012|01|CNY0.00|0|CNY600.00|2|
                    
                
                
                    B201805240009
                    2
                    CNY400.00
                    
                        0110|C1010511003703|00|CNY0.00|0|CNY400.00|2|
                    
                
                
                    B201805240010
                    2
                    CNY1200.00
                    
                        0111|C1010211000012|01|CNY0.00|0|CNY1200.00|4|
                    
                
                
                    B201805240012
                    1
                    CNY1200.00
                    
                        0116|C1010511003703|00|CNY1200.00|4|CNY0.00|0|
                    
                
            
        
    

主要核心代码如下:

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 SttlList = new ArrayList();
        //获得指定节点下面的子节点,首先要知道自己要操作的节点。
        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 SttlInfList = SttlListEle.elements();
        //遍历SttlInfList节点
        String SttlReptFlg  = "";
        Integer SttlDCFlg = null;
        BigDecimal SttlAmt = null;
        for(Element e : SttlInfList){
            List BatchList = new ArrayList();
            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 BatchInfList = BatchListEle.elements();
            for(Element e2 : BatchInfList){
                List SubItemList = new ArrayList();
                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 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;
    }

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

 

 

同名原创公众号: 程序大视界

 

你可能感兴趣的:(《Java,语言篇》,《Java基础,》)