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