java 는 Digester 로 xml 파일 을 분석 합 니 다. 효율 적 인 xml 분석 입 니 다.

Digester 는 jdk 에서 자체 적 으로 가지 고 있 는 것 이 아니 라 의존 가방 이 있 습 니 다. comons - beanutils. jar, comons - collections. jar, comons - digester. jar, comons - logging - 1.1.3. jar.다운로드 주소: 클릭 하여 링크 열기
  Digester 바 텀 은 SAX 로 XML 파일 을 해석 하기 때문에 자 연 스 럽 게 대상 이 특정 XML 요 소 를 식별 할 때 (실제 begin, body, end, finish 네 시점 으로 세분 화 됨) 특정 자바 대상 을 만 들 거나 특정 대상 을 호출 하 는 방법 등 특정 동작 을 수행 하 게 된다.이 곳 의 XML 요 소 는 일치 하 는 패턴 (matching pattern) 에 따라 인식 되 며, 관련 동작 은 규칙 (rule) 에 의 해 정 의 됩 니 다.전환 과정 에서 Digester 는 대상 변환 테이블 로 볼 수 있 는 대상 스 택 을 유지 하여 변환 중 생 성 되 거나 임시 생 성 된 자바 대상 을 저장 합 니 다.입력 XML 파일 을 완전히 스 캔 한 후 대상 스 택 의 스 택 상단 요 소 는 대상 대상 입 니 다.Digester 가 SAX 해석 의 디 테 일 을 차 단 했 기 때문에 사용 자 는 전환 작업 자체 에 만 관심 을 가지 고 전환 작업 을 크게 간소화 했다.Digester 는 규칙 에 따라 방법 을 실행 할 때 자바 반사 집행 방법 을 사용한다.
  본 논문 예제 의 프로젝트 소스 코드 다운로드 주소: 클릭 하여 링크 열기
  위 xml 파일 내용:
<?xml version="1.0" encoding="UTF-8"?>

<CCMS_DATA>
  <CCMS_MAXAMOUNT_DATA>
    <ROW>
      <SYSCODE>BEPS</SYSCODE>
      <SENDBANK>ALL</SENDBANK>
      <RECVBANK>ALL</RECVBANK>
      <MSGTYPE>ALL</MSGTYPE>
      <BIZTYPE>0</BIZTYPE>
      <AMTLMT>9999999999999.99</AMTLMT>
      <CHKLEVEL>10</CHKLEVEL>
    </ROW>
    <ROW>
      <SYSCODE>BEPS</SYSCODE>
      <SENDBANK>ALL</SENDBANK>
      <RECVBANK>ALL</RECVBANK>
      <MSGTYPE>PKG001</MSGTYPE>
      <BIZTYPE>0</BIZTYPE>
      <AMTLMT>50000.00</AMTLMT>
      <CHKLEVEL>11</CHKLEVEL>
    </ROW>
    <ROW>
      <SYSCODE>BEPS</SYSCODE>
      <SENDBANK>ALL</SENDBANK>
      <RECVBANK>ALL</RECVBANK>
      <MSGTYPE>PKG003</MSGTYPE>
      <BIZTYPE>0</BIZTYPE>
      <AMTLMT>9999999999999.99</AMTLMT>
      <CHKLEVEL>11</CHKLEVEL>
    </ROW>
  </CCMS_MAXAMOUNT_DATA>

</CCMS_DATA>

  상위 코드:
  enity / bean 층:
package com.bosspay.entity;

public class DicAmtLimit {
	private long id;
	private String syscode;
	private String mt;
	private String txtp;
	private String sndrbk;
	private String rcvbk;
	private String chcklvl;
	private String amtupperlmt;

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getSyscode() {
		return syscode;
	}

	public void setSyscode(String syscode) {
		this.syscode = syscode;
	}

	public String getMt() {
		return mt;
	}

	public void setMt(String mt) {
		this.mt = mt;
	}

	public String getTxtp() {
		return txtp;
	}

	public void setTxtp(String txtp) {
		this.txtp = txtp;
	}

	public String getSndrbk() {
		return sndrbk;
	}

	public void setSndrbk(String sndrbk) {
		this.sndrbk = sndrbk;
	}

	public String getRcvbk() {
		return rcvbk;
	}

	public void setRcvbk(String rcvbk) {
		this.rcvbk = rcvbk;
	}

	public String getChcklvl() {
		return chcklvl;
	}

	public void setChcklvl(String chcklvl) {
		this.chcklvl = chcklvl;
	}

	public String getAmtupperlmt() {
		return amtupperlmt;
	}

	public void setAmtupperlmt(String amtupperlmt) {
		this.amtupperlmt = amtupperlmt;
	}
}

  dao 층:
package com.bosspay.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

import com.bosspay.common.DataUtil;
import com.bosspay.entity.DicAmtLimit;

public class DicAmtLimitDao {

	public static final String TABLE_NAME = "DIC_AMT_LIMIT";
	
	public static final String ID = "id";

	public static final String SYSCODE = "syscode";
	public static final String MT = "mt";
	public static final String TXTP = "txtp";
	public static final String SNDRBK = "sndrbk";
	public static final String RCVBK = "rcvbk";
	public static final String CHCKLVL = "chcklvl";
	public static final String AMTUPPERLMT = "amtupperlmt";
	
	private static final String INSERT_SQL = "insert into " + TABLE_NAME +"("
		+SYSCODE+","+MT+","+TXTP+","+SNDRBK+","+RCVBK+","+CHCKLVL+","+AMTUPPERLMT
		+ ")values(?,?,?,?,?,?,?)";

	private static DicAmtLimitDao instance = new DicAmtLimitDao();
	
	public static DicAmtLimitDao getInstance(){
		
		return instance;
	}
	
	/**
	 *     
	 * @param DicAmtLimit
	 * @return
	 * @throws SQLException
	 */
	public boolean insertBatch(List<DicAmtLimit> dicAmtLimits){
		try {
			Connection conn = DataUtil.getInstance().getConnection(); //     
			PreparedStatement stm = conn.prepareStatement(INSERT_SQL);
			for (DicAmtLimit dicAmtLimit : dicAmtLimits) {
				stm.setString(1, dicAmtLimit.getSyscode());
				stm.setString(2, dicAmtLimit.getMt());
				stm.setString(3, dicAmtLimit.getTxtp());
				stm.setString(4, dicAmtLimit.getSndrbk());
				stm.setString(5, dicAmtLimit.getRcvbk());
				stm.setString(6, dicAmtLimit.getChcklvl());
				stm.setString(7, dicAmtLimit.getAmtupperlmt());
				stm.addBatch();
			}
			stm.executeBatch();
			DataUtil.getInstance().close(stm, conn);  //     
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return true;
	}

}

  처리 층 (내 가 정의 한 것 은 사실 이 층 은 dao 층 과 한 층 으로 합 칠 수 있 습 니 다):
package com.bosspay.processor;
import java.util.ArrayList;
import java.util.List;

import com.bosspay.dao.DicAmtLimitDao;
import com.bosspay.entity.DicAmtLimit;


public class DicAmtLimitProcessor {
	private List<DicAmtLimit> dicAmtLimits = new ArrayList<>();
	private DicAmtLimitDao dicAmtLimitDao = new DicAmtLimitDao();
	private long num;
	
	public void addDicAmtLimit(DicAmtLimit dicAmtLimit){
		if(dicAmtLimits.size()>=5000){
			this.dicAmtLimitDao.insertBatch(dicAmtLimits);
			this.dicAmtLimits.clear();
			System.out.println("        "+num+" !");
		}
		this.dicAmtLimits.add(dicAmtLimit);
		num += 1;
	}
	
	public void lastInsert(){
		this.dicAmtLimitDao.insertBatch(dicAmtLimits);
		System.out.println("        "+num+" !");
	}
}

  해석 규칙 층:
package com.bosspay.processor;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;

import com.bosspay.entity.DicAmtLimit;



public class DicAmtLimitParse {
	private Digester digester = new Digester();
	
	public void parse(String path) throws IOException, SAXException{
		String CCMS_MAXAMOUNT_DATA = "CCMS_DATA/CCMS_MAXAMOUNT_DATA";
		String ROW = CCMS_MAXAMOUNT_DATA+"/ROW";
		//       
		digester.setValidating(false);
		digester.push(this);// this          DicAmtLimitParse  
		//addObjectCreate:                              
		//   CCMS_DATA/CCMS_MAXAMOUNT_DATA     DicAmtLimitProcessor       
		digester.addObjectCreate(CCMS_MAXAMOUNT_DATA, DicAmtLimitProcessor.class);
		//   CCMS_DATA/CCMS_MAXAMOUNT_DATA/ROW     DicAmtLimit       
		digester.addObjectCreate(ROW, DicAmtLimit.class);
		//     DicAmtLimitParse、DicAmtLimitProcessor、DicAmtLimit 3   
		//addBeanPropertySetter:                         setter  ,         
		//   CCMS_DATA/CCMS_MAXAMOUNT_DATA/ROW/SYSCODE     DicAmtLimit   setSyscode  
		digester.addBeanPropertySetter(ROW+"/SYSCODE", "syscode");
		digester.addBeanPropertySetter(ROW+"/SENDBANK", "sndrbk");
		digester.addBeanPropertySetter(ROW+"/RECVBANK", "rcvbk");
		digester.addBeanPropertySetter(ROW+"/MSGTYPE", "mt");
		digester.addBeanPropertySetter(ROW+"/BIZTYPE", "txtp");
		digester.addBeanPropertySetter(ROW+"/AMTLMT", "amtupperlmt");
		digester.addBeanPropertySetter(ROW+"/CHKLEVEL", "chcklvl");
		//                      ,                ,                 
		//   CCMS_DATA/CCMS_MAXAMOUNT_DATA/ROW        DicAmtLimitProcessor addDicAmtLimit  ,
		//   DicAmtLimit  
		digester.addSetNext(ROW, "addDicAmtLimit");
		//   CCMS_DATA/CCMS_MAXAMOUNT_DATA        DicAmtLimitParse clearList  ,
		//   DicAmtLimitProcessor  
		digester.addSetNext(CCMS_MAXAMOUNT_DATA, "clearList");
		//  xml     
		InputStream stream = new FileInputStream(new File(path));
		//digester  xml      
		digester.parse(stream);	
		stream.close();
	}
	
	public void clearList(DicAmtLimitProcessor xmlProcessor){
		xmlProcessor.lastInsert();
	}
	
	public Digester getDigester() {
		return digester;
	}
	
	public void setDigester(Digester digester) {
		this.digester = digester;
	}
}

  주의해 야 할 것 은 digester 는 실제 적 으로 해석 규칙 을 설정 하고 정 의 된 규칙 에 부 딪 혔 을 때 해당 하 는 방법 을 실행 하 며 xml 구조 가 중복 되 었 을 때 해당 하 는 방법 을 반복 합 니 다.때때로 이러한 상황 에 부 딪 힐 수 있 습 니 다: xml 를 자바 대상 으로 변환 할 때 속성 중복 (xml 요소 중복). 이때 우 리 는 자바 bean 속성의 setter 방법 을 수정 할 수 있 습 니 다. 배열, 집합 또는 문자열 조합 등 방법 으로 중복 속성의 값 을 저장 할 수 있 습 니 다. 어차피 digester 는 setter 방법 만 알 고 대응 하 는 속성 이 없어 도 좋 습 니 다. 저 는 코드 에 주석 을 달 아 설명 하 겠 습 니 다.
xml 파일:
          10086       10010       10000    
bean 중: / * * 기구 번호 에 직접 참여 하여 * / private String mmbCds = "; /mmbCds 만 밝 혔 고 mmbCd 는 밝 히 지 않 았 습 니 다.
/ / mmbCd 를 만 드 는 setter 방법
public void setMmbCd(String mmbCd) { if(this.mmbCds.equals("")){ this.mmbCds = mmbCd; }else{ this.mmbCds = this.mmbCds + "," + mmbCd; } }
규칙 설정 시: digester. addBeanPropertySetter (ROW + "/ mmbcd", "mmbCd");
생 성 된 대상 mmbCds 속성 을 분석 하 는 값 은 10086, 10010, 10000 입 니 다.
digester 는 반사 체 제 를 사용 하기 때문에 우 리 는 반사 원리 에 따라 코드 를 적당 하 게 바 꾸 고 복잡 한 구 조 를 간단하게 해석 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기