通過遞歸的方式解析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;
	}
	
	
	
	
	
}




發佈了43 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章