千家信息网

Dom4j如何解析xml复杂多节点报文

发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,这篇文章主要介绍了Dom4j如何解析xml复杂多节点报文,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Dom4j解析xml复杂多节点报
千家信息网最后更新 2024年11月14日Dom4j如何解析xml复杂多节点报文

这篇文章主要介绍了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复杂多节点报文"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

    0