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;
}
以上:有疑问或建议欢迎指出更正。感谢分享!
觉得对你有帮助,关注博客和公众号。不定期分享最新前沿技术框架和bat大厂常用技术等,加群不定期分享行业内大牛直播讲课以及获得视频课件资料等。