Dom4j解析xml复杂多节点报文方式

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;
    }

dom4j解析多层xml

package com.bessky.hrmis.test;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4JDemo {
    public static void main(String[] args) throws Exception {
        // 1.创建Reader对象
        SAXReader reader = new SAXReader();
        String str = "\r\n"
            + "    \r\n" + "        hanke_tom\r\n"
            + "        \r\n"
            + "            tom\r\n"
            + "            http://192.168.1.5:8080/sso/logout\r\n"
            + "            false\r\n"
            + "            2019-11-26T17:47:55.789+08:00[Asia/Shanghai]\r\n"
            + "            01\r\n"
            + "            TomAuthenticationHandler\r\n"
            + "            TomAuthenticationHandler\r\n"
            + "            张三\r\n"
            + "            false\r\n"
            + "            00001\r\n"
            + "            hanke_tom\r\n" + "            \r\n"
            + "    \r\n" + "";
        // 2.加载xml
        Document document = DocumentHelper.parseText(str);
        // 3.获取根节点
        Element rootElement = document.getRootElement();
        Iterator iterator = rootElement.elementIterator();
        
        System.out.println("根节点:" + rootElement.getName()); // 拿到根节点的名称
        
        Iterator bbbb = rootElement.elementIterator("authenticationSuccess"); 
        
        while (bbbb.hasNext()) {
            Element recordEless = (Element) bbbb.next();
            Iterator cccc = recordEless.elementIterator("attributes"); 
            while (cccc.hasNext()) {
                Element itemEle = (Element) cccc.next();
                String username = itemEle.elementTextTrim("job_number"); 
                System.err.println("---------"+username);
            }
        }
    }
}

如果后面还有子级继续while向下取数据

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

你可能感兴趣的:(Dom4j解析xml复杂多节点报文方式)