320 likes | 588 Views
자바 개발자를 위한 XML. Chap9. SAX(Simple API for XML) 김만수. CHAPTHER 9. SAX(Simple API for XML) XML 파서 SAX 소개 SAX 의 클래스와 인터페이스들 에러 핸들러와 파서 특성들 예제 프로그램. 9.1 XML 파서. XML Parser 프로그램에서 XML 문서의 내용을 처리하거나 , 내용을 변경할 경우 사용 XML 문서가 올바르게 작성되었는지 여부를 판단 XML Parser 의 종류. 9.1 XML 파서.
E N D
자바 개발자를 위한 XML Chap9. SAX(Simple API for XML) 김만수
CHAPTHER 9 • SAX(Simple API for XML) • XML 파서 • SAX 소개 • SAX의 클래스와 인터페이스들 • 에러 핸들러와 파서 특성들 • 예제 프로그램
9.1 XML 파서 • XML Parser • 프로그램에서 XML 문서의 내용을 처리하거나, 내용을 변경할 경우 사용 • XML 문서가 올바르게 작성되었는지 여부를 판단 • XML Parser의 종류
9.1 XML 파서 • XML Parser API 종류 • Tree 기반 API • XML 문서를 내부적인 tree 구조로 변환 • 응용프로그램이 tree를 traverse 하면서 작업 수행 • Event 기반 API • 파싱 이벤트을 call-back을 통해 응용 프로그램이 직접 처리 • 내부적으로 tree 구조 생성하지 않음 • DOM(Document Object Model) • 가장 대표적인 트리 기반 API • W3C에서 HTML과 XML 문서를 위한 표준 API개발 • 장점 • 다양한 분야의 응용프로그램에 사용 가능 • 단점 • XML 문서가 큰 경우 많은 시스템 자원을 사용
9.1 XML 파서 • SAX(Simple API for XML) • 가장 대표적인 이벤트 기반 API • 장점 • DOM에 비해 간단한 구조 • 시스템 자원을 적게 사용 • 단점 • 기능면에서 DOM 만큼 강력하지 못함
9.2 SAX 소개 • SAX • 프로그래밍에서 XML 문서의 구조와 내용을 접근하기 위한 표준화된 API • Version 1, 2 발표 • 관련 사이트 : http://www.saxproject.org • XML 문서의 Validation 확인
9.2 SAX 소개 표준 sax parser 사용을 위한 package 선언 apache parser의 여러 기능을 사용하기 위한 package 선언 Parser 생성 Parsing Well-Formed 인지 확인 SaxDemo 클래스를 생성하고, 해당 객체의 dolt() 메쏘드를 호출
9.3 SAX의 클래스와 인터페이스 • SAX에 관련된 중요한 인터페이스와 클래스들 • org.xml.sax, org.xml.sax.helpers, org.apache.xerces.parser 패키지에 포함 • XMLReader 인터페이스 • SAX Parser를 위한 기본적인 기능 요구 사항을 선언 • SAX 응용 프로그램은 XMLReader Interface를 Implements하여 구현 • 특징 • 특성(feature)과 속성(property)를 설정하고, 값을 알아보는 표준화된 API를 지원 • XML의 네임스페이스를 지원 • 동기화된 메쏘드 • 메쏘드를 호출하는 경우에 메쏘드가 완전히 수행한 다음에 리턴 • SAX에서 XMLReader의 parse() 메쏘드 수행 각 상황메 맞는 메쏘드가 호출 됨
9.3.2 SAXParser 클래스 • XMLReader 인터페이스를 Implements 한 SAX Parser Class • XMLDocumentHandler와 DTDHandler Interface를 Implements
9.3.2 ContentHandler • SAX에서 XML문서의 이벤트를 받는 인터페이스
9.3.2 ContentHandler startDocument() startElement() startElement() characters() endElement() · · · endElement() endDocument()
9.3.4 DefaultHandler 클래스 • EntityResolver, DTDHandler, DocumentHandler, ErrorHandler 인터페이스들을 Implements한 클래스 • XML 문서를 처리하기 위해 • DefaultHandler class로 부터 상속하여 응용 클래스를 작성 • DefaultHandler에서 필요한 메쏘드들을 오버라이딩 • p 9-8, 9-9 참조
9.3.5 Attributes 인터페이스 • XML 속성들 리스트를 위한 인터페이스 타입 • 세가지 방법으로 속성들 리스트에 접근 • 속성 인덱스 • 네임스페이스를 사용항 이름 • XML 1.0 이름 • Attributes 인터페이스 메쏘드 • p. 9-13, 9-14 참조
각 element의 이름 해당 element에 포함된 attribute의 리스트를 포함 attribute의 이름이 “type”인 값을 검색그러나, <address> element는 속성을 가지지 않기 때문에 값이 null <zipcode> element의 attribute의 이름이 “type”값 즉, “학교”를 검색
9.3.6 Locator 인터페이스 • XML 문서의 위치 정보 알기 • 메쏘드
9.3.7 DTDHandler 인터페이스 • Notation이나 파싱되지 않는 Entity에 관한 정보가 필요할 경우 DTDHandler Intergace를 implements • DTD 문서에서 Notation 선언과 파싱되지 않는 Entity의 이벤트만 처리 • startDocument event가 발생하고 첫 번째 startElement event 전에 모든 DTD event를 처리 • 메쏘드
그 외 인터페이스와 클래스 • 9.3.8 EntityResolver 인터페이스 • 외부 Entity를 include하기 전에 응용프로그램이 중간에서 처리할 수 있도록 지원 • 데이터베이스 혹은 다른 입력 source의 내용을 이용해서 XML 문서를 작성할 때 유용 • 9.3.9 InputSource 클래스 • 입력된 XML문서를 다른 특별한 형태로 사용 • 바이트 스트림 • 문자 스트림
9.4 에러 핸들러와 파서 특성들 • 9.4.1 에러 핸들러 • 에러의 종류 • Fatal error, Error, Warning • 치명적인 에러(fatal error) • XML 문서가 잘 정의되지(well-formed) 않은 경우 발생 • ErrorHandler Interface의 fatalError() 메쏘드 • 에러(Error) • XML 문서에서 유효성(validity)과 관련된 제약 사항에 위반되는 경우에 발생 • Error는 DTD 또는 Schema가 존재해야 함 • ErrorHandler Interface의 error() 메쏘드 • 경고(warnig) • SAX 파서가 DTD를 처리하는 동안에 발생 • 개발자에게 특정 정보를 제공하기 위해서 사용 • p. 9-27 참조 • ErrorHandler Interface의 warning() 메쏘드 • 예제 • p. 9-28, 9.29 참조
9.4.2 Parser Features • Xerces Parser • 유효성 체크?, 네임스페이스 사용여부? 등 많은 특성들을 설정할 수 있는 방법들을 제공 • SAXParser와 DOMParser 모두 사용 • 메쏘드 • void setFeature(String featureId, boolean state) : 특성 설정 • boolean getFeature(String featureId) : 특성 설정 여부 확인 • featureId
9.4.2 Parser Property • SAXParser와 DOMParser의 속성을 설정 기능 • 메쏘드 • void setProperty(String propertyId, Object value) : 속성 설정 • void getProperty(String propertyId) : 설정된 속성 값 확인 • propertyId • p. 9-31, 9-32 참조
9.5 예제 프로그램 • 9.5.1 SAX를 이용한 주소관리 address-book.xsd address-book.xml java 프로그램으로 처리
9.5 예제 프로그램 • 프로그램 설명 • address-book.xml과 address-book.xsd 문서를 읽어 하나의 AddressBook 객체 속에 다수의 Person 객체를 만든 후에 생성된 순서대로 Person 정보를 출력하는 프로그램 • 관련 객체 • AddressBookApp : main 프로그램 • AddressBookHandler : SAX 인벤트를 처리하고, <addrss-book> element를 이벤트에서 AddressBook객체를 생성하고, <person> element 이벤트 처리에서 Person 개체를 만들고, 해당 정보를 설정 후 Address 객체에 Person 개체를 추가 • AddressBook : 하나의 AddressBook 객체로 한 개 이상의 Person 개체를 가짐 • Person : name, email, phone 정보를 가지는 객체
AddressBookApp.java 1 2 3 4 5 6 • address-book.xml를 전용으로 처리하는 SAXParser용 처리 프로그램 • SAXParser 생성 • parser에 Event 핸들러인 AddressBookHandler 객체 설정 • 파서 시작 - 처리는 AddressBookHandler 객체가 처리 • 모든 처리 후에 생성된 하나의 AddressBook 객체의 Reference를 참조 • 출력
AddressBookHandler.java 1 2 3 4 • <address-book> element를 만나면 AddressBook인 book 객체 생성 • <person> element를 만나면 Person인 person 객체 생성 • person 정보를 만나면 해당 state를 설정 • </person> element를 만나면 book객체에 person 추가 • </name>, </email>, </phone> element를 만나면 2번 단계에서 생성된 person 객체에 해당 정보를 설정 • 다른 정보 설정을 방지 하기 위해 state를 NONE으로 설정 5 6
AddressBook.java 타입과 크기가 정의되지 않은 배열 배열의 크기를 1증가 시키고, 해당 객체의 객체를 추가 특정 배열 위치(index)의 person 객체를 리턴 배열의 크기를 확인 특정 배열 위치(i)의 person 객체를 리턴 출력 형태를 지정 이 부분을 XML, HTML, PDF 등 각종 출력 양식으로 코드를 작성하면 됨 n명의 name, email, phone 정보를 담을 문자열 배열 n x 3 생성