通过递归的方式解析String 字符串类型的XML并保存进实体

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值