package com.wxd.util;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import com.wxd.entity.BodyItemInfo;
import com.wxd.entity.DetailInfo;
/**
* @author wxd
* @category 配置文件讀取的主要管理類
*/
public class XMLParseManager {
/**
* @param xmlDoc
* @return 最終響應信息Bean
* @throws Exception
*/
public static ResponseInfo getResponseInfoByXML(String xmlDoc) throws Exception{
ResponseInfo respInfo = null;
if (xmlDoc!=null && !xmlDoc.equals("")) {
Pattern p = Pattern.compile("\r|\n");
Matcher m = p.matcher(xmlDoc);
xmlDoc = m.replaceAll("");
}
try {
/*1.獲取Document*/
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(xmlDoc.getBytes("UTF-8")));
/*調用解析xml文件方法將xml報文解析成java對象*/
respInfo = new ResponseInfo();
respInfo.convertDocuument2DetailInfo(document, null);
}catch (Exception e) {
e.printStackTrace();
throw e;
}
return respInfo;
}
/*public static Object covertResponseInfo2DataBean(ResponseInfo respInfo){
}*/
public static void main(String[] args){
String xmlDoc = "<TX><REQUEST_SN>請求序列碼</REQUEST_SN><CUST_ID>客戶號</CUST_ID><TX_CODE>6WY105</TX_CODE><RETURN_CODE>返回碼</RETURN_CODE><RETURN_MSG>返回碼說明</RETURN_MSG><LANGUAGE>CN</LANGUAGE><TX_INFO><ACCNO1>本方賬號</ACCNO1><CURR_COD>幣種</CURR_COD><ACC_NAME>本方賬號名稱</ACC_NAME><ACC_ORGAN>本方賬號開戶機構</ACC_ORGAN><ACC_STATE>本方賬號狀態</ACC_STATE><INTR>利率</INTR><TOTAL_PAGE>總頁次</TOTAL_PAGE><PAGE>當前頁次</PAGE><POSTSTR>定位串</POSTSTR><FLAG>是否可生成標識位</FLAG><FILE_LOCSTR>生成文件定位串</FILE_LOCSTR><DET_ITEM>明細筆數</DET_ITEM><DETAILLIST><DETAILINFO><TRANDATE>交易日期</TRANDATE><TRANTIME>交易時間</TRANTIME><CRE_TYP>憑證種類</CRE_TYP><CRE_NO>憑證號碼</CRE_NO><MESSAGE>摘要</MESSAGE><AMT>發生額</AMT><AMT1>餘額</AMT1><FLAG1>借貸標誌</FLAG1><ACCNO2>對方賬號</ACCNO2><ACC_NAME1>對方戶名</ACC_NAME1><FLAG2>交易鈔匯標誌</FLAG2><TRAN_FLOW>交易流水號</TRAN_FLOW><BFLOW>企業支付流水號</BFLOW><DET_NO>活存賬戶明細號</DET_NO><DET>備註</DET></DETAILINFO><DETAILINFO><TRANDATE>交易日期123</TRANDATE><TRANTIME>交易時間</TRANTIME><CRE_TYP>憑證種類</CRE_TYP><CRE_NO>憑證號碼</CRE_NO><MESSAGE>摘要</MESSAGE><AMT>發生額</AMT><AMT1>餘額</AMT1><FLAG1>借貸標誌</FLAG1><ACCNO2>對方賬號</ACCNO2><ACC_NAME1>對方戶名</ACC_NAME1><FLAG2>交易鈔匯標誌</FLAG2><TRAN_FLOW>交易流水號</TRAN_FLOW><BFLOW>企業支付流水號</BFLOW><DET_NO>活存賬戶明細號</DET_NO><DET>備註</DET></DETAILINFO></DETAILLIST></TX_INFO></TX> ";
try {
ResponseInfo aa = new XMLParseManager().getResponseInfoByXML(xmlDoc);
System.out.println("HEAD:-----"+aa.getHead());
HashSet<DetailInfo> ss = aa.getdInfo();
Iterator it = ss.iterator();
while(it.hasNext()){
DetailInfo detailInfo = (DetailInfo) it.next();
System.out.println("DETAILINFO:-----"+detailInfo);
}
System.out.println("body:------"+aa.getBody());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.wxd.util;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashSet;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import com.wxd.entity.BodyItemInfo;
import com.wxd.entity.DetailInfo;
import com.wxd.entity.HeaderItemInfo;
/**
* ������Ӧ��Ϣ�Ļ���
* @author wxd
*
*/
public class ResponseInfo {
/**������Ӧͷ*/
private HeaderItemInfo head;
/**������Ӧbody��Ϣ*/
private BodyItemInfo body ;
private HashSet<DetailInfo> dInfo = new HashSet<DetailInfo>();
private int status = 1;
/**
* @param document(xml����)
* @throws IException
* @throws IException
* @category ��documentת��Ϊbean����head��body��
*/
public void convertDocuument2DetailInfo(Node node, Object info) throws Exception {
short nodeType = node.getNodeType();
switch (nodeType) {
case Node.DOCUMENT_NODE:
{
convertDocuument2DetailInfo(((Document) node).getDocumentElement(), info);
break;
}
case Node.ELEMENT_NODE:
{
Node child = node.getFirstChild();
while(child != null){
if("TX_INFO".equals(child.getNodeName())){
//�ж��ӽڵ��Ƿ�ΪTX_INFO
head = (HeaderItemInfo) info;
if(status == 1){
info = new BodyItemInfo();
status = 2;
}
convertDocuument2DetailInfo(child, info);
//body.add((BodyItemInfo) info);
} else {
if("REQUEST_SN".equals(child.getNodeName()))
{
info = new HeaderItemInfo();
}
if("TX_INFO".equals(node.getNodeName())){
convertDocuument2DetailInfo(child, info);
body = (BodyItemInfo) info;
}
if("DETAILINFO".equals(child.getNodeName())){
info = new DetailInfo();
convertDocuument2DetailInfo(child, info);
//aInfo.add((DetailInfo) info);
dInfo.add((DetailInfo) info);
info = null;
}
convertDocuument2DetailInfo(child, info);
}
//������һ���ڵ�
child = child.getNextSibling();
}
break;
}
case Node.TEXT_NODE:
{
/*��ݸ��ڵ����ƣ��������Ӧ��ֵ*/
String parentNodeName = node.getParentNode().getNodeName();
if(info != null){
if(!"null".equalsIgnoreCase(node.getNodeValue()) && !"".equals(node.getNodeValue())){
Method[] method = info.getClass().getDeclaredMethods();
if(method != null){
for(int i=0; i<method.length; i++){
//���..ItemInfo�д��ڸ��ֶ����ԣ���Ϊ����ֵ
if(("set" + parentNodeName).equalsIgnoreCase(method[i].getName())){
method[i].invoke(info, node.getNodeValue());
}
}
}
}
}
break;
}
}
}
//---------------getters and setters----------------------//
public HeaderItemInfo getHead() {
return head;
}
public void setHead(HeaderItemInfo head) {
this.head = head;
}
public BodyItemInfo getBody() {
return body;
}
public void setBody(BodyItemInfo body) {
this.body = body;
}
public HashSet<DetailInfo> getdInfo() {
return dInfo;
}
public void setdInfo(HashSet<DetailInfo> dInfo) {
this.dInfo = dInfo;
}
}