1、接口
import org.dom4j.Document; public interface NgsnConvertor { public Object Convert2Bean(Document ngsnBody); public Document Convert2Xml(Object obj); }
2、公共方法
import java.util.List; import org.apache.commons.lang.StringUtils; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.Node; public abstract class NgsnConvertorAbstract implements NgsnConvertor { //根据xpath路径得到节点值,ex. /Document/FIToFICstmrCdtTrf/CdtTrfTxInf/CdtrAcct/Id/SubAcct/Id/IBAN protected static String getBeanAttributeValue(Document doc, String xpath){ String value = null; if(StringUtils.isBlank(xpath)){ return value; } Element element = (Element) doc.selectSingleNode(xpath); if(element!=null){ value = element.getText(); } return value; } //设置节点的值,/Document/FIToFICstmrCdtTrf/CdtTrfTxInf/CdtrAcct/Id/SubAcct/Id/IBAN = abc public static void setBeanAttributeValue(Document doc, String xpath, String value){ if(StringUtils.isNotBlank(xpath)){ String[] nodes = xpath.substring(1, xpath.length()).split("/"); Node firstNode = doc.selectSingleNode(nodes[0]); Element element = doc.getRootElement(); if(firstNode==null){ element = doc.addElement(nodes[0]); } String nodePath = new String(); for(String node : nodes){ nodePath += "/"+node; Node n = element.selectSingleNode(nodePath); if(n == null){ element = element.addElement(node); }else { element = (Element) element.selectSingleNode(nodePath); } } element.setText(value == null ? "" : value); } } //增加节点的属性,ex. /Document/FIToFICstmrCdtTrf/CdtTrfTxInf/DbtrSttlm/IntrBkSttlmAmt Ccy=CNY public static void setBeanAttribute(Document doc, String xpath, String name, String value, int number){ if(StringUtils.isNotBlank(xpath)){ Element element = (Element) doc.selectNodes(xpath).get(number); element.addAttribute(name, value); } } //增加List节点,ex. /Document/FIToFICstmrCdtTrf/CdtTrfTxInf/DbtrSttlm/IntrBkSttlmAmt protected static void setBeanListAttribute(Document doc, String xpath){ if(StringUtils.isNotBlank(xpath)){ String[] nodes = xpath.substring(1, xpath.length()).split("/"); Node firstNode = doc.selectSingleNode(nodes[0]); Element element = doc.getRootElement(); if(firstNode==null){ element = doc.addElement(nodes[0]); } String nodePath = new String(); for(String node : nodes){ nodePath += "/"+node; Node n = element.selectSingleNode(nodePath); if(n == null || node.equals(nodes[nodes.length-1])){ element = element.addElement(node); }else { element = (Element) element.selectSingleNode(nodePath); } } } } //增加多层List节点,ex. /Document/FIToFICstmrCdtTrf/CdtTrfTxInf/DbtrSttlm/IntrBkSttlmAmt protected static void setBeanListAttribute(Document doc, String xpath1, int i, String xpath2){ Element element = (Element) getBeanListAttribute(doc,xpath1).get(i); if(StringUtils.isNotBlank(xpath2)){ String[] nodes = xpath2.substring(1, xpath2.length()).split("/"); String nodePath = new String(); nodePath = xpath1; for(String node : nodes){ nodePath += "/"+node; Node n = element.selectSingleNode(nodePath); if(n == null || node.equals(nodes[nodes.length-1])){ element = element.addElement(node); }else { element = (Element) element.selectSingleNode(nodePath); } } } } //增加List节点属性,ex. /Document/FIToFICstmrCdtTrf/CdtTrfTxInf/DbtrSttlm/IntrBkSttlmAmt protected static void setBeanListAttributeValue(Document doc, String xpath, String xpathList, String value, int number){ if(StringUtils.isNotBlank(xpathList)){ String[] nodes = xpathList.substring(1, xpathList.length()).split("/"); List<Element> elements = doc.selectNodes(xpath); Element element = elements.get(number); for(String node : nodes){ Element ele = element.element(node); if(ele != null){ element = ele; }else{ element = element.addElement(node); } } if(element!=null){ element.setText(value == null ? "" : value); } } } //根据xpath得到list节点中节点值 protected static String getBeanListAttributeValue(Document doc, String xpath, int number){ String value = null; if(StringUtils.isBlank(xpath)){ return value; } Element element = (Element) doc.selectNodes(xpath).get(number); if(element != null){ value = element.getText(); } return value; } //获取list节点 protected static List<Element> getBeanListAttribute(Document doc, String xpath){ List<Element> elementList = null; if(StringUtils.isBlank(xpath)){ return elementList; } elementList = doc.selectNodes(xpath); return elementList; } //获取节点属性值 public static String getBeanAttribute(Document doc, String xpath, String name, int number){ String value = null; if(StringUtils.isNotBlank(xpath)){ Element element = (Element) doc.selectNodes(xpath).get(number); value= element.attributeValue(name); } return value; } }
3.1、简单 单循环 用法(样例)
import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; public class Convertor_Ngsn_916_001_01_Demo extends NgsnConvertorAbstract { @Override public Object Convert2Bean(Document ngsnBody) { ClearBookClearJournal clearBookClearJournal = new ClearBookClearJournal(); clearBookClearJournal.setClearMessageId(getBeanAttributeValue(ngsnBody,"//NGSNClrRpt/MsgHdr/MsgId")); clearBookClearJournal.setClearAgentBic(getBeanAttributeValue(ngsnBody,"//NGSNClrRpt/MsgHdr/CreDtTm")); List<ClearTrxClearDetailRet> clearDetailList = new ArrayList<ClearTrxClearDetailRet>(); List<Element> elementList = getBeanListAttribute(ngsnBody, "//NGSNClrRpt/Rpt/ClrInf/TxsSummry"); for(int i=0;i<elementList.size();i++){ ClearTrxClearDetailRet clearDetail = new ClearTrxClearDetailRet(); clearDetail.setClearResultId(getBeanListAttributeValue(ngsnBody, "//NGSNClrRpt/Rpt/ClrInf/TxsSummry/SttlmDt", i)); clearDetail.setClearBookClearJournalId(getBeanListAttributeValue(ngsnBody, "//NGSNClrRpt/Rpt/ClrInf/TxsSummry/DbtrSttlm/IntrBkSttlmAmt", i)); clearDetail.setClearDate(getBeanListAttributeValue(ngsnBody, "//NGSNClrRpt/Rpt/ClrInf/TxsSummry/DbtrSttlm/IntrBkSttlmDt", i)); clearDetailList.add(clearDetail); } clearBookClearJournal.setClearDetailList(clearDetailList); return clearBookClearJournal; } @Override public Document Convert2Xml(Object obj) { Document ngsnBody = DocumentHelper.createDocument(); ClearBookClearJournal clearBookClearJournal = (ClearBookClearJournal)obj; setBeanAttributeValue(ngsnBody,"/Document/NGSNClrRpt/MsgHdr/MsgId",clearBookClearJournal.getClearMessageId()); setBeanAttributeValue(ngsnBody,"/Document/NGSNClrRpt/MsgHdr/CreDtTm",clearBookClearJournal.getClearAgentBic()); List<ClearTrxClearDetailRet> clearDetailList = clearBookClearJournal.getClearDetailList(); if(clearDetailList!=null && clearDetailList.size()>0){ for(int i=0;i<clearDetailList.size();i++){ ClearTrxClearDetailRet clearDetail = clearDetailList.get(i); //增加List父节点 setBeanListAttribute(ngsnBody, "/Document/NGSNClrRpt/Rpt/ClrInf/TxsSummry"); //增加List节点中的叶子节点并赋值 setBeanListAttributeValue(ngsnBody,"/Document/NGSNClrRpt/Rpt/ClrInf/TxsSummry", "/SttlmDt", clearDetail.getClearResultId(), i); setBeanListAttributeValue(ngsnBody,"/Document/NGSNClrRpt/Rpt/ClrInf/TxsSummry","/DbtrSttlm/IntrBkSttlmAmt",clearDetail.getClearBookClearJournalId(), i); //给叶子节点增加属性 setBeanAttribute(ngsnBody, "/Document/NGSNClrRpt/Rpt/ClrInf/TxsSummry/DbtrSttlm/IntrBkSttlmAmt", "Ccy", "CNY", i); setBeanListAttributeValue(ngsnBody,"/Document/NGSNClrRpt/Rpt/ClrInf/TxsSummry","/DbtrSttlm/IntrBkSttlmDt",clearDetail.getClearDate(), i); } } return ngsnBody; } }
3.2、多层嵌套循环 用法(样例)
import java.math.BigDecimal; import org.dom4j.Document; import org.dom4j.DocumentHelper; /** * 交易汇总报文 * * @author * @Date 2016-11-03 */ public class Convertor_Ngsn_167_001_01_Example extends NgsnConvertorAbstract { // 报文标识号 private static final String MESSAGE_ID = "//TxSummaryNtfctn/MsgHdr/MsgId"; // 报文发送时间 private static final String CREATION_DATETIME = "//TxSummaryNtfctn/MsgHdr/CreDtTm"; // 发起机构BIC private static final String INSTRUCTING_AGENT_BIC = "//TxSummaryNtfctn/MsgHdr/InstgAgt/FinInstnId/BICFI"; // 发起机构LEI private static final String INSTRUCTING_AGENT_LEI = "//TxSummaryNtfctn/MsgHdr/InstgAgt/FinInstnId/LglNttId"; // 发起机构号 private static final String INSTRUCTING_AGENT_ID = "//TxSummaryNtfctn/MsgHdr/InstgAgt/FinInstnId/Othr/Id"; // 接收机构BIC private static final String INSTRUCTED_AGENT_BIC = "//TxSummaryNtfctn/MsgHdr/InstdAgt/FinInstnId/BICFI"; // 接收机构LEI private static final String INSTRUCTED_AGENT_LEI = "//TxSummaryNtfctn/MsgHdr/InstdAgt/FinInstnId/LglNttId"; // 接收机构号 private static final String INSTRUCTED_AGENT_ID = "//TxSummaryNtfctn/MsgHdr/InstdAgt/FinInstnId/Othr/Id"; // 汇总日期 private static final String FROM_DATETIME = "//TxSummaryNtfctn/Rpt/AggtdDt"; // 汇总机构BIC private static final String SUMMARY_AGENT_BIC = "//TxSummaryNtfctn/Rpt/InstnInf/FinInstnId/BICFI"; // 汇总机构LEI private static final String SUMMARY_AGENT_LEI = "//TxSummaryNtfctn/Rpt/InstnInf/FinInstnId/LglNttId"; // 汇总机构号 private static final String SUMMARY_AGENT_ID = "//TxSummaryNtfctn/Rpt/InstnInf/FinInstnId/Othr/Id"; // 汇总币种 private static final String SUMMARY_CURRENCY = "//TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/Ccy"; // 汇总报文类型 private static final String SUMMARY_MSGTYPE = "//TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgNmId"; // 汇总报文状态 private static final String SUMMARY_MSGSTATUS = "//TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgStsSummry/MsgSts"; // 汇总发送报文总笔数 private static final String SENDMSG_COUNT = "//TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgStsSummry/TxsSummry/TtlDlvrgNtries/NbOfNtries"; // 汇总发送报文总金额 private static final String SEND_AMOUNT = "//TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgStsSummry/TxsSummry/TtlDlvrgNtries/Sum"; // 汇总接收报文总笔数 private static final String RECMSG_COUNT = "//TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgStsSummry/TxsSummry/TtlRcvgNtries/NbOfNtries"; // 汇总接收报文总金额 private static final String REC_AMOUNT = "//TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgStsSummry/TxsSummry/TtlRcvgNtries/Sum"; /** * xml转Bean * * @author */ @Override public Object Convert2Bean(Document ngsnBody) { // 报文业务信息登记簿 CoreBookMessageBus msgBus = new CoreBookMessageBus(); msgBus.setMessageId(getBeanAttributeValue(ngsnBody, MESSAGE_ID));// 报文标识号 msgBus.setInstructingAgentBic(getBeanAttributeValue(ngsnBody, INSTRUCTING_AGENT_BIC));// 发起机构BIC msgBus.setInstructingAgentId(getBeanAttributeValue(ngsnBody, INSTRUCTING_AGENT_ID));// 发起机构号 msgBus.setInstructedAgentBic(getBeanAttributeValue(ngsnBody, INSTRUCTED_AGENT_BIC));// 接收机构BIC msgBus.setInstructedAgentId(getBeanAttributeValue(ngsnBody, INSTRUCTED_AGENT_ID));// //接收机构号 msgBus.setCreationDatetime(getBeanAttributeValue(ngsnBody, CREATION_DATETIME));// 报文发送时间 // 交易汇总登记簿 ClearBookTransSummary clearBookTransSummaryBean = new ClearBookTransSummary(); clearBookTransSummaryBean.setMessageId(getBeanAttributeValue(ngsnBody, MESSAGE_ID)); // 报文标识号 clearBookTransSummaryBean.setCreationDateTime(getBeanAttributeValue(ngsnBody, CREATION_DATETIME)); // 报文发送时间 clearBookTransSummaryBean.setInstructingAgentBic(getBeanAttributeValue(ngsnBody, INSTRUCTING_AGENT_BIC));// 发起机构BIC clearBookTransSummaryBean.setInstructingAgentLei(getBeanAttributeValue(ngsnBody, INSTRUCTING_AGENT_LEI));// 发起机构LEI clearBookTransSummaryBean.setInstructingAgentId(getBeanAttributeValue(ngsnBody, INSTRUCTING_AGENT_ID)); // 发起机构号 clearBookTransSummaryBean.setInstructedAgentBic(getBeanAttributeValue(ngsnBody, INSTRUCTED_AGENT_BIC)); // 接收机构BIC clearBookTransSummaryBean.setInstructingAgentLei(getBeanAttributeValue(ngsnBody, INSTRUCTED_AGENT_LEI)); // 接收机构LEI clearBookTransSummaryBean.setInstructedAgentId(getBeanAttributeValue(ngsnBody, INSTRUCTED_AGENT_ID)); // 接收机构号 clearBookTransSummaryBean.setFromDatetime(getBeanAttributeValue(ngsnBody, FROM_DATETIME)); // 汇总日期 clearBookTransSummaryBean.setSummaryAgentBic(getBeanAttributeValue(ngsnBody, SUMMARY_AGENT_BIC)); // 汇总机构BIC clearBookTransSummaryBean.setSummaryAgentLei(getBeanAttributeValue(ngsnBody, SUMMARY_AGENT_LEI)); // 汇总机构LEI clearBookTransSummaryBean.setSummaryAgentId(getBeanAttributeValue(ngsnBody, SUMMARY_AGENT_ID)); // 汇总机构号 clearBookTransSummaryBean.setSummaryCurrency(getBeanAttributeValue(ngsnBody, SUMMARY_CURRENCY)); // 汇总币种 clearBookTransSummaryBean.setSummaryMsgType(getBeanAttributeValue(ngsnBody, SUMMARY_MSGTYPE)); // 汇总报文类型 clearBookTransSummaryBean.setSummaryMsgStatus(getBeanAttributeValue(ngsnBody, SUMMARY_MSGSTATUS)); // 汇总报文状态 clearBookTransSummaryBean.setSendMsgCount(Long.parseLong(getBeanAttributeValue(ngsnBody, SENDMSG_COUNT))); // 汇总发送报文总笔数 BigDecimal bdsendCount = new BigDecimal(getBeanAttributeValue(ngsnBody, SEND_AMOUNT)); clearBookTransSummaryBean.setSendAmount(bdsendCount.setScale(2, BigDecimal.ROUND_HALF_UP)); // 汇总发送报文总金额 clearBookTransSummaryBean.setRecMsgCount(Long.parseLong(getBeanAttributeValue(ngsnBody, RECMSG_COUNT))); // 汇总接收报文总笔数 BigDecimal bdRecvCount = new BigDecimal(getBeanAttributeValue(ngsnBody, REC_AMOUNT)); clearBookTransSummaryBean.setRecAmount(bdRecvCount.setScale(2, BigDecimal.ROUND_HALF_UP)); // 汇总接收报文总金额 return msgBus; } /** * beab转xml * * @author */ @Override public Document Convert2Xml(Object obj) { Document ngsnBody = DocumentHelper.createDocument(); // CoreBookMessageBus bus = (CoreBookMessageBus) obj; setBeanAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/MsgHdr/MsgId","M234567890123451"); //报文标识号 setBeanAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/MsgHdr/CreDtTm","2016-09-01T09:15:05.000+08:00");//"2016-09-01T09:15:05.000+08:00"); //报文发送时间 setBeanAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/MsgHdr/InstgAgt/FinInstnId/Othr/Id","CN04000001JJ"); //发起机构号 setBeanAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/MsgHdr/InstdAgt/FinInstnId/BICFI","ICBKCNBJ");//"ICBKCNBJ");//bus.getInstructedAgentBic()); //接收机构BIC setBeanAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/MsgHdr/InstdAgt/FinInstnId/LglNttId","A0000000000000000011");//"A0000000000000000011");//bus.getInstructedAgentLei()); //接收机构LEI setBeanAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/MsgHdr/InstdAgt/FinInstnId/Othr/Id","CN01123456AA"); //接收机构号 setBeanAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/AggtdDt","2016-08-01T00:00:00.000+08:00");//"2016-08-01T00:00:00.000+08:00"); setBeanAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/FinInstnId/BICFI","ICBKCNBJ");//"ICBKCNBJ");//clearBookTransSummaryBean.getInstructingAgentBic());//发起机构BIC setBeanAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/FinInstnId/LglNttId","A0000000000000000011");//"A0000000000000000011");//clearBookTransSummaryBean.getInstructingAgentLei());//发起机构LEI setBeanAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/FinInstnId/Othr/Id","CN01123456AA");//"CN01123456AA");//clearBookTransSummaryBean.getInstructingAgentId()); //发起机构号 int flagJ = 0; int flagK = 0; int flagX = 0; for(int i=0;i<2;i++){ setBeanListAttribute(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/ChngDtls"); setBeanListAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/ChngDtls", "/Ccy", "CNY", i); for(int j=0;j<2;j++){ setBeanListAttribute(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/ChngDtls",i,"/MsgSummry"); setBeanListAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry","/MsgNmId", "ngsn.167.001.01",flagJ); for(int k=0;k<2;k++){ setBeanListAttribute(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry",flagJ,"/MsgStsSummry"); setBeanListAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgStsSummry","/MsgSts", "CLRD",flagK); for(int x=0;x<2;x++){ setBeanListAttribute(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgStsSummry",flagK,"/TxsSummry"); setBeanListAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgStsSummry/TxsSummry","/TtlDlvrgNtries/NbOfNtries", "1",flagX); setBeanListAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgStsSummry/TxsSummry","/TtlDlvrgNtries/Sum", "20000",flagX); setBeanAttribute(ngsnBody, "/Document/TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgStsSummry/TxsSummry/TtlDlvrgNtries/Sum", "Ccy","CNY",flagX); setBeanListAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgStsSummry/TxsSummry","/TtlRcvgNtries/NbOfNtries", "1",flagX); setBeanListAttributeValue(ngsnBody,"/Document/TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgStsSummry/TxsSummry","/TtlRcvgNtries/Sum", "20000",flagX); setBeanAttribute(ngsnBody, "/Document/TxSummaryNtfctn/Rpt/InstnInf/ChngDtls/MsgSummry/MsgStsSummry/TxsSummry/TtlRcvgNtries/Sum", "Ccy","CNY",flagX); flagX++; } flagK++; } flagJ++; } } System.out.println(ngsnBody.asXML()); return ngsnBody; } public static void main(String[] args) { Convertor_Ngsn_167_001_01_Example example = new Convertor_Ngsn_167_001_01_Example(); Object obj = new Object(); example.Convert2Xml(obj); } }