java 는 Digester 로 xml 파일 을 분석 합 니 다. 효율 적 인 xml 분석 입 니 다.
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 파일:
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 는 반사 체 제 를 사용 하기 때문에 우 리 는 반사 원리 에 따라 코드 를 적당 하 게 바 꾸 고 복잡 한 구 조 를 간단하게 해석 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.