XML PARSER 이야기 XML Programming!!
XML Parser의 종류 SAX (The Simple API for XML) DOM (Document Object Model) . XML Programming!!
XML Parser의 역할 Invoke the parser XML 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 제목 </library> Document <?xml version="1.0"?> <library> “주석" <item> <item> type “책 제목" type "CD 제목" "book" “cd“ XML Programming!!
Parser 비교 SAX Event-based API 장점 단점 전체 Tree를 만드는 것이 아니라 등록된 Event의 Callback함수를 만들어 사용 장점 대용량 대규모 문서 처리 가능 순차적으로 일괄 처리하는 경우에 빠른 처리 가능 구조자체가 관심사항이 아닌 경우 단점 문서의 구조를 얻어내기가 힘들다. 동일한 구조를 여러 번 반복 사용할 경우 반복해서 parsing을 해야 한다. XML Programming!!
Event-Based <?xml version=“1.0” …?> <연구실 이름 = “xmlab"> <학생>을 찾으면 저를 불러 주세요!!! SAX Parser <?xml version=“1.0” …?> <연구실 이름 = “xmlab"> <담당교수> <이름>홍길동</이름> </담당교수> <학생> <이름>이몽룡</이름> <과정>석사2학기</과정> </학생> </연구실> Parsing Method 화면에 “찾았다”를 출력한다. Call-Back!!! “찾았다” XML Programming!!
Parser의 비교(계속) DOM Tree-based API Parsing 후에 Memory상에 문서전체의 Tree구조를 만들어 사용 장점 Tree구조를 가지므로 처리가 용이하다. 몇 번이고 원하는 부분을 추가 및 수정 가능 문서의 구조가 충실히 보존돼야 하는 경우(ex:XML Editor.. 단점 메모리상에 DataStructure를 만들기 때문에 큰 문서에는 적당하지 않다 DOM구조를 생성하는데 시간이 오래 걸린다. XML Programming!!
Tree-Based <?xml version=“1.0” …?> <연구실 이름 = “xmlab"> DOM Parser <?xml version=“1.0” …?> <연구실 이름 = “xmlab"> <담당교수> <이름>홍길동</이름> </담당교수> <학생> <이름>이몽룡</이름> <과정>석사2학기</과정> </학생> </연구실> Parsing DOM Tree 구조 NODE XML Programming!!
Parser의 비교(계속) SAX와 DOM 비교 XML Programming!!
SAX와 DOM의 Specification Interface형태로 배포 DOM OMG의 IDL(interface definition language)로 기술 http://www.w3.org/TR/DOM-Level-2-Core/ XML Programming!!
MS의 MSXML 파서에서의 SAX MSXML Version 1.0 2.0 2.5 2.6 3.0 Installed with IE4 IE5 Win2000 MSDN DOM O XSL Xpath SAX SAX2 XML Programming!!
새로운 Version에서 추가된 것들… SAX 2.0 DOM Level 2 DeclHandler LexicalHandler Namespace지원 DOM Level 2 Views Stylesheets Events (org.w3c.dom.events) Traversal (org.w3c.dom.traversal) Range (org.w3c.dom.range) 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) JAXP의 필요성 SUN에서 제안한 표준 자바 API 각 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 JAXP 지원 API DOM API SAX API org.apache.* javax.xml.* DOM API org.w3c.dom.* SAX API org.xml.sax.* XML Programming!!
SAX 이야기 kjaelee@orgio.net 이 길 재 XML Programming!!
순 서 Handler SAX API 살펴보기 7가지 Handler 살펴보기 3가지 package 살펴보기 XML Programming!!
Handler이야기 7개의 Handler ContentHandler ErrorHandler DTDHandler EntityResolver DefaultHandler DeclHandler LexicalHandler XML Programming!!
… XML Programming!!
EventHandler vs SAXHandler 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() public void endDocument() Document가 시작된다는 이벤트가 발생할 때 호출된다. 즉 parsing 시작에 발생 public void endDocument() XML문서의 파싱이 끝날 때 발생하는 이벤트에 호출된다. public void startElement() 엘리먼트가 시작된다는 이벤트가 발생할 때 호출된다. 엘리먼트가 끝났다는 이벤트가 발생할 때 호출된다. 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, int start, int length) 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.String name) Report the end of an entity. public void startCDATA () Report the start of a CDATA section. public void startDTD (String name, String pubId, String sysId) Report the start of DTD declarations, if any. public void startEntity (String name) 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 (String eName, String aName, String type, String valueDefault, String value) Report an attribute type declaration. public void elementDecl (String name, String model) Report an element type declaration. public void externalEntityDecl (String name, String publicId, String systemId) Report a parsed external entity declaration. public void internalEntityDecl (String name, String value) Report an internal entity declaration XML Programming!!
DefaultHandler Interface Class 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 org.xml.helper org.xml.ext XML Programming!!
Deprecated SAX1.0 -> SAX2.0 Deprecated Class NameSpace지원 문제 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.InputStream byteStream) InputSource (java.io.Reader characterStream) InputSource (java.lang.String systemId) 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!!
SAX에서 제안하는 방법 Interface인 XMLReader를 벤더가 제공하는 SAXParser를 이용해서 생성하는 것이다. ... // className은 사용할 parser class 이름. 가령 // org.apache.xerces.parsers.SAXParser 등... XMLReader myReader=XMLReaderFactory.createXMLReader( java.lang.String className); myReader.parse(String uri); XML Programming!!
… 직접 매개변수를 넣어 생성하지 않고 시스템 프로퍼티에 설정하는 방법이다. Ex 실행방법 (-D옵션) ... XMLReader myReader = XMLReaderFactory.createXMLReader(); myReader.parse(String uri); 실행방법 (-D옵션) org.xml.sax.driver = org.apache.xerces.parsers XML Programming!!
… 인터페이스인 XMLReader를 직접 구현된 SAXParser로 생성해 사용할 수도 있다. Ex: ... XMLReader myReader = new SAXParser(); myReader.parse(String uri); XML Programming!!
Handler등록하기 SAXParser.setContentHandler(ContentHandler); SAXParser.setErrorHandler(ErrorHandler) SAXParser.setDTDHandler(DTDHandler) SAXParser.setEntityResolver(EntityResolver) XML Programming!!