개발/java,spring

java xml 파싱 또다른 방법 sax 파싱

Mr.mandu. 2018. 10. 24. 14:42

이전에 DocumentBuilder 를 통해 xml 문서를 파싱한 포스팅을 하였습니다.


[개발/java,spring] - 자바 xml 데이터, 속성 파싱(java xml parsing data, attribute)


하지만 이 방식으로 할경우 

Doctype 에 파일 정보(파일명, 경로 등)이 적혀있을경우 에러가 발생하였습니다.

그리하여 찾은 것이

Handler를 이용한 xml 파싱 방법 입니다.


xml 내용입니다.




	
		홍길동
		25
		
			A
			B
			C
		
	
	
		임꺽정
		22
		
			AA
			BB
			CC
		
		




그리고 바로 소스 첨부하겠습니다.

XMLParserHandler.java 파일을 생성하였습니다.


package lee.comm.util;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class XMLParserHandler  extends DefaultHandler {
 	private String elementName = "";
    private StringBuffer sBuffer = new StringBuffer();
    
    private ArrayList tagList  = new ArrayList();
    
    // XML 문서의 시작이 인식되었을 때 발생하는 이벤트를 처리
    public void startDocument() {
        //System.out.println("Start Document");
    }
    
    // XML 문서의 끝이 인식되었을 때 발생하는 이벤트를 처리
    public void endDocument() {
        //System.out.println("End Document");
    }
 
    // 엘리먼트의 시작을 인식했었을 때 발생하는 이벤트를 처리
    public void startElement(String uri, String localName, String qname, Attributes attr) { 
        elementName = qname;    //element명을 멤버 변수에 넣어 둔다.
        int attrCount=attr.getLength(); // 태그 개수
        String attrName=attr.getQName(0); // 첫번째 태그 임의 설정
        String attrValue=attr.getValue(attrName);
        /*
         * 활용 예시
        if(qname.equals("img")){
  		  int attrCount=attr.getLength(); // 태그 개수
	        for(int i=0; i9){
	        		 String file_nm = attrValue.substring(attrValue.lastIndexOf(".")-6);
     	        	tagList.add(file_nm);	 
	        	 }
	        	//System.out.println("속성값=============" + attrName+""+attrValue);	 
	         }
	        }
  	  }
	         */
      System.out.println("속성값=============" + attrName+"=="+attrValue);
      
        sBuffer.setLength(0);    // buffer 초기화
    }
 
    // 엘리먼트의 끝을 인식했었을 때 발생하는 이벤트를 처리
    public void endElement(String uri, String localName, String qname) {    
        System.out.println("End element, Name: " + qname);
    }
 
    // 각 element의 값 (인식된 문자의 각 세그먼트에 대해서 호출)
    public void characters(char[] ch, int start, int length) throws SAXException {
        String strValue = "";
 
        // element의 값을 구하기 위해서는 buffer에 인식된 각 문자를 start에서 length만큼 append한다.
        sBuffer.append(new String(ch, start, length));
        strValue = sBuffer.toString().trim();
        
        if (strValue != null && strValue.length() != 0 && !strValue.equals("\n")) {
           System.out.println("elementName: " + elementName + ", strValue: "+ strValue);
        }
    }
    
    public ArrayList getTagList() {
        return tagList;
    }
}


소스 끝에 </attrcount;></string></string> 이게 안지워지네요.. 지워서 사용하세요

사용 방법입니다.

File file = new File("src/main/webapp/resources/sample/xmlTest.xml");
		SAXParserFactory spf = SAXParserFactory.newInstance();
		spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
        spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
        spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
        SAXParser sp = spf.newSAXParser();
        XMLParserHandler parserHandler = new XMLParserHandler();
        sp.parse(file, parserHandler);        // Start Parsi
        ArrayList tagList = parserHandler.getTagList();

getTagList는 xml에서 추출한 값들을 따로 사용하기 위함 입니다.


설명들을 적는것보다 소스를 보시고

한번 돌려보시면 이해 될거라 생각됩니다.


아니면 댓글 주시면 성실히 답변드리겠습니다.



태그 및 속성값들이 확인되는 모습을 확인 할 수 있습니다.