본문 바로가기

General/Java

[Java] XML Parsing - SAX


- Simple API for XML -

XML 문서 내용 중 엘리먼트, 문자 데이터, 프로세싱 지시자를 만나면 그 이벤트를 ContentHandler 인터페이스를 구현하는 이벤트 핸들러 객체에게 전달한다.

DTD 내용 중에 노테이션 선언과 외부 언파스드 엔티티 선언을 만나면 그 이벤트를 DTDHandler 인터페이스를 구현하는 이벤트 핸들러 객체에게 전달한다.

DTD 나 XML 문서 내용 중에서 외부 파스드 엔티티에 대한 참조를 만나면 그 이벤트를 EntityResolver 인터페이스를 구현하는 이벤트 핸들러 객체에게 전달한다.

XML 문서 파싱 중에 파싱 에러가 발생하면 그 이벤트를 ErrorHandler 인터페이스를 구현하는 이벤트 핸들러 객체에게 전달한다.

- 이벤트가 발생했을 때 처리하는 내용을 DTDHandler, ContentHandler, EntityResolver, ErrorHandler 인터페이스를 구현하는 클래스에 작성해 두어야 한다.

- 이벤트 핸들러의 구현 객체는 SAX 파서의 parse() 메소드를 호출하기전에 XMLReader 인터페이스의 메소드를 이용하여 SAX 파서에 등록해 두어야 한다.
SAX 파서는 등록된 이벤트 핸들러 객체에게만 이벤트를 전달한다.





- SAX 파서 객체 생성 : 파서공장생성, 파서생성
- SAX 파서에 기능 추가

- ContentHandler의 이벤트 처리(ContentHandler를 구현한 클래스)
startElement()
stopElement
namespaceURL / localName / qName / atts(start만)
character
ch
start
Length

- DTDHandler의 이벤트 처리(DTDHandler를 구현한 클래스)

- EntityResolver의 이벤트 처리(implements EntityResolver)
publicId
systemId
InputSource

- ErrorHandler의 이벤트 처리(implements ErrorHandler)
fatalError() : XML문서가 Well-formed하게 작성되지 않은 경우(권고안을 지키지 않았을경도) 발생하는 이벤트를 처리하는 메소드
error() : XML문서가 유효한 문서가 아닐 경우(DTD, XML Schema 정의 구조 x)에 발생하는 이벤트를 처리하는 메소드
warning() : fatalError 및 error 이외의 이벤트를 처리하는 메소드

- DefaultHandler의 이벤트 처리(extends DefaultHandler)
위 4개의 핸들러는 메소드를 모두 구현해야 한다.(abstract class를 implements하기때문)
하지만 DefaultHandler는 상속받아서 구현하기 때문에, override할 메소드만 구현하면 된다.