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