540 likes | 951 Views
XML PARSER 이야기. XML Parser 의 종류. SAX (The Simple API for XML) DOM (Document Object Model). XML Parser 의 역할. Invoke the parser Parser 가 하는 일 Validation Well formedness checking Building a document tree Notifying the application of errors. file, stream 을 다룸 XML Parser 자신만의 파서를 구성할 수 있다
E N D
XML PARSER 이야기 XML Programming!!
XML Parser의 종류 • SAX (The Simple API for XML) • DOM (Document Object Model) . XML Programming!!
XML Parser의 역할 • Invoke the parser • Parser가 하는 일 • Validation • Well formedness checking • Building a document tree • Notifying the application of errors. • file, stream을 다룸 • XML Parser • 자신만의 파서를 구성할 수 있다 • Apache Xerces, IBM XML4J, XML4C, James Clark의 XP XML Programming!!
SAX(The Simple API for XML) • XML-Dev mailing list 회원들의 제안 • 현재 Version 2.0 (2000.5) • Parser의 상호간에 표준 API 필요성 제기 • Event-based API 제공 XML Programming!!
DOM(Document Object Model) • W3C에서 제안 • 현재 Level 2.0(2000.11), Level 3.0 진행중 • HTML, XML문서에 대한 표준 Interface 정의 • JavaScript의 document객체 XML Programming!!
DOM(계속) • XML문서의 객체와 인터페이스 포함 • XML문서에 대한 프로그램할 수 있는interface 제공 • 인터페이스에는 문서의 논리적구조와 접근 방법에 대한 tree-based API제공 XML Programming!!
XML 문서 Tree <?xml version="1.0"?> <library> <!-- 주석--> <item type="book"> 책 제목 </item> <item type="cd"> CD 제목 </item> </library> Document <library> <?xml version="1.0"?> “주석" <item> <item> "CD 제목" type type “책 제목" “cd“ "book" XML Programming!!
Parser 비교 • SAX • Event-based API • 전체 Tree를 만드는 것이 아니라 등록된 Event의 Callback함수를 만들어 사용 • 장점 • 대용량 대규모 문서 처리 가능 • 순차적으로 일괄 처리하는 경우에 빠른 처리 가능 • 구조자체가 관심사항이 아닌 경우 • 단점 • 문서의 구조를 얻어내기가 힘들다. • 동일한 구조를 여러 번 반복 사용할 경우 반복해서 parsing을 해야 한다. XML Programming!!
<학생>을 찾으면 저를 불러 주세요!!! Parsing Event-Based SAX Parser <?xml version=“1.0” …?> <연구실 이름 = “xmlab"> <담당교수> <이름>홍길동</이름> </담당교수> <학생> <이름>이몽룡</이름> <과정>석사2학기</과정> </학생> </연구실> Method 화면에 “찾았다”를 출력한다. Call-Back!!! “찾았다” XML Programming!!
Parser의 비교(계속) • DOM • Tree-based API • Parsing 후에 Memory상에 문서전체의 Tree구조를 만들어 사용 • 장점 • Tree구조를 가지므로 처리가 용이하다. • 몇 번이고 원하는 부분을 추가 및 수정 가능 • 문서의 구조가 충실히 보존돼야 하는 경우(ex:XML Editor.. • 단점 • 메모리상에 DataStructure를 만들기 때문에 큰 문서에는 적당하지 않다 • DOM구조를 생성하는데 시간이 오래 걸린다. XML Programming!!
DOM Tree 구조 DOM Parser Parsing NODE NODE NODE NODE NODE Tree-Based <?xml version=“1.0” …?> <연구실 이름 = “xmlab"> <담당교수> <이름>홍길동</이름> </담당교수> <학생> <이름>이몽룡</이름> <과정>석사2학기</과정> </학생> </연구실> XML Programming!!
Parser의 비교(계속) • SAX와 DOM 비교 XML Programming!!
SAX와 DOM의 Specification • SAX • Interface형태로 배포 • DOM • OMG의 IDL(interface definition language)로 기술 • http://www.w3.org/TR/DOM-Level-2-Core/ XML Programming!!
MS의 MSXML 파서에서의 SAX XML Programming!!
새로운 Version에서 추가된 것들… • SAX 2.0 • DeclHandler • LexicalHandler • Namespace지원 • DOM Level 2 • Views • Stylesheets • Events (org.w3c.dom.events) • Traversal (org.w3c.dom.traversal) • Range (org.w3c.dom.range) • Namespace지원 XML Programming!!
Namespace • Namespace는 이름의 충돌을 방지한다. <root> <!--아래의 class는 java의 class--> <java:class xmlns:java="http://java.sun.com"> <parameter type="int">number</parameter> <return type="String">result</return> </java:class> <!--아래의 class는 학급이다--> <school:class xmlns:school="http://www.dgu.ac.kr"> <학년>1</학년> <반>1</반> <학생수>20</학생수> </school:class> </root> XML Programming!!
주요 Parsers • Apache Xerces • IBM XML4J • Oracle XML Parser • Sun Microsystems Project X ( !=JAXP) • JamesClark’s XP • OpenXML • MicroSoft’s MSXML • … XML Programming!!
JAXP • JAXP(Java API for XML Processing) • SUN에서 제안한 표준 자바 API • JAXP의 필요성 • 각 Vendor의 Parser가 각기 조금씩 다른 API를 제공 • J2EE기반에서 사용할 표준 XML API필요 • JAXP는 각 Vendor가 제공하는 Parser를 사용할 수 있는 추상적인 층(abstract layer)를 제공 XML Programming!!
쉬어가는 페이지 • 쉬어갑니다!! XML Programming!!
XML4J(Xerces-J) • IBM • TX-Parser로 연구 시작 • Apache Project에 참여 • 현재 Apache Xerces-J를 Test하고, 배포 • Java로 쓰여진 대표적인 XML Parser XML Programming!!
Getting Prepared • Obtaining a Parser • http://www.alphaworks.ibm.com/formula/로 가서 XML4J를 Download한다. • Make sure that your Java environment • JDK 설치 확인 • CLASSPATH에 XMLParser Class가 설정되었는가 확인 XML Programming!!
XML4J 둘러 보기 • Vendor제공 API • org.apache.* • JAXP 지원 API • javax.xml.* • DOM API • org.w3c.dom.* • SAX API • org.xml.sax.* XML Programming!!
SAX 이야기 kjaelee@orgio.net 이 길 재 XML Programming!!
순 서 • Handler • 7가지 Handler 살펴보기 • SAX API 살펴보기 • 3가지 package 살펴보기 XML Programming!!
Handler이야기 • 7개의 Handler • ContentHandler • ErrorHandler • DTDHandler • EntityResolver • DefaultHandler • DeclHandler • LexicalHandler XML Programming!!
… XML Programming!!
EventHandler vs SAXHandler • EventHandler public class Test { … button.addActionListener(myHandler); ... } class MyHandler implements ActionListener{ public void actionPerformed(ActionEvent e) { System.out.println(“button click!!!”); } } XML Programming!!
SAX Handler public void creatSAXParser() { // SAXParser를 생성한다. SAXParser mySAXParser = new SAXParser(); // handler를 생성한다. handler내에 startElement()가 있다. MyContentHandler contentHandler = new MyContentHandler(); // contentHandler를 등록 시켰다. mySAXParser.setContentHandler(contentHandler); // parsing작업을 시작한다. mySAXParser.parse(uri); } class MyContentHandler implements ContentHandler { // element를 만나면 호출되어진다. public void startElement(, , ,){ System.out.println("element를 만났습니다!!!") } } XML Programming!!
ContentHandler • 가장 기본이 되는 인터페이스 • Document가 시작되거나 엘리먼트가 시작되는 등의 파싱중 발생되는 거의 대부분의 이벤트를 처리한다. XML Programming!!
… • 중요 method • public void startDocument() • Document가 시작된다는 이벤트가 발생할 때 호출된다. 즉 parsing 시작에 발생 • public void endDocument() • XML문서의 파싱이 끝날 때 발생하는 이벤트에 호출된다. • public void startElement() • 엘리먼트가 시작된다는 이벤트가 발생할 때 호출된다. • public void endDocument() • 엘리먼트가 끝났다는 이벤트가 발생할 때 호출된다. • public void Characters() • 파싱시 character를 만났을 때 발생하는 이벤트에 호출된다. XML Programming!!
ErrorHandler • 입력된 문서가 well-formed한가? 또 valid한가? 등을 검사해 발생하는 에러 이벤트를 처리한다. • 중요 method • public void warning() • 가벼운 경고 이벤트가 발생할 때 호출된다. 각 벤더의 파서 마다 경고가 발생하는 경우가 다르다. • public void error() • Valid Parser에서 valid하지 않은 문서를 파싱했을 때 발생하는 에러 이벤트에 호출된다. • public void fatalError() • Well-formed하지 않은 문서를 파싱할 경우 발생하는 에러 이벤드에 호출된다. XML Programming!!
DTDHandler • 노테이션 선언이나 파싱되지 않은 엔티티 선언을 만나면 발생하는 이벤트를 처리한다. • 중요 method • notationDecl(String name, String pubID, String sysID) • Notation 선언을 만나면 호출된다. • unparsedEntityDecl(String name, String pubID, String sysID, String notationName) • unparsedEntityDecl선언을 만나면 호출된다. XML Programming!!
EntityResolver • 외부 엔티티를 만났을 때 발생하는 이벤트를 처리한다. • 시스템 식별자를 얻어내는 등의 목적으로 사용한다. • 중요 method • public InputSource resolveEntity(String pubID, String sysID) • 외부 Entity를 만나면 호출된다. XML Programming!!
LexicalHandler • 이름 그대로 Lexical이벤트 처리를 보강하기 위한 Handler이다. • 코멘트나 CDATA등을 만났을 때 발생하는 이벤트를 처리한다. • To set the LexicalHandler for an XML reader, use the setProperty method with the propertyId "http://xml.org/sax/properties/lexical-handler". XML Programming!!
… • 중요 method • public void comment(char[]ch, intstart, intlength) • Report an XML comment anywhere in the document. • public void endCDATA() • Report the end of a CDATA section. • public void endDTD () • Report the end of DTD declarations. • public void endEntity (java.lang.Stringname) • Report the end of an entity. • public void startCDATA () • Report the start of a CDATA section. • public void startDTD (Stringname, StringpubId, StringsysId) • Report the start of DTD declarations, if any. • public void startEntity(Stringname) • Report the beginning of an entity in content. XML Programming!!
DeclHandler • DTD처리를 보강하기 위해 새로 추가된 Handler이다. • 여러 종류의 선언을 만났을 때 발생하는 이벤트를 처리한다. • To set the DeclHandler for an XML reader, use the setProperty method with the propertyId "http://xml.org/sax/properties/declaration-handler". • If you are using the declaration handler together with a lexical handler, all of the events will occur between the startDTD and the endDTD events. XML Programming!!
… • 중요 method • public void attributeDecl (StringeName, StringaName, Stringtype, StringvalueDefault, Stringvalue) • Report an attribute type declaration. • public void elementDecl(Stringname, Stringmodel) • Report an element type declaration. • public void externalEntityDecl(Stringname, StringpublicId, StringsystemId) • Report a parsed external entity declaration. • public void internalEntityDecl (Stringname, Stringvalue) • Report an internal entity declaration XML Programming!!
DefaultHandler • Interface • ContentHandler • ErrorHandler • DTDHandler • EntityResolver • Class • DefaultHandler implements ContentHandler, ErrorHandler, DTDHandler, EntityHandler XML Programming!!
… ContentHandler ErrorHandler DTDHandler EntityResolver Implements DefaultHandler Extends MyHandler 모든 Handler역할가능 XML Programming!!
쉬어가는 페이지 • 쉬어갑니다!! XML Programming!!
SAX API 살펴보기 • 3개의 Package • org.xml.sax • 기본적인 SAX의 기능을 기술한 인터페이스와 클래스, 그리고 예외클래스를 담은 패키지 • org.xml.helper • org.xml.sax 패키지의 클래스를 도와주는 기능의 클래스가 담긴 패키지 • org.xml.ext • SAX2.0에서 처음 추가된 기능의 패키지 XML Programming!!
Deprecated • SAX1.0 -> SAX2.0 • NameSpace지원 문제 • Deprecated Class XML Programming!!
기타 Interface들 • XMLReader • Attributes • Locator • XMLFilter XML Programming!!
기타 Class들 • XMLReaderFactory • InputSource • AttributesImpl • LocatorImpl • XMLFilterImpl • ParserAdapter • XMLReaderAdapter • NamespaceSupport XML Programming!!
… • InputSource • This class encapsulates all information about a resurce used in XML processing • This can be as little as a String or InputSteam used for locating lnput, or as complex as an entity with a publicID and systemID as well as a URI reference • 중요 생성자 • InputSource () • InputSource (java.io.InputStreambyteStream) • InputSource (java.io.ReadercharacterStream) • InputSource (java.lang.StringsystemId) XML Programming!!
… • Ex : public Node getDOM(File uri){ … try{ /* 수정 fis = new FileInputStream(uri); isr = new InputStreamReader(fis); InputSource is = new InputSource(isr); */ InputSource is = new InputSource(uri.toURL().toString()); … } XML Programming!!
잠시 쉬어가기!! … XML Programming!!
SAX Parser 생성하기 • 3가지 생성방법 비교 • SAXParser 클래스를 직접 생성해 사용한다. • XML4J에서 가능 • SAXParserFactory를 이용해 SAXParser를 생성해 사용한다. • JAXP에서 제안 • XMLReader로 SAXParser를 생성해 사용한다. • SAX에서 제안 XML Programming!!
XML4J에서 생성 • XML4J나 Oracle의 SAXParser는 클래스(추상클래스 아님) 이므로 직접 생성해 사용가능 • Ex: import org.apache.xerces.parsers.SAXParser; … SAXParser mySAXParser = new SAXParser(); mySAXParser.parse(String uri); … XML Programming!!
JAXP에서 생성 • JAXP에서는 SAXParser가 추상클래스이다. • 그러므로 SAXParserFactory를 이용해서 생성해 사용한다. • Ex: import javax.xml.parsers.*; ... SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance(); SAXParser mySAXParser = mySAXParserFactory.newSAXParser(); mySAXParser.parse(String uri, new MyDefaultHandler()); ... XML Programming!!