54
XML Programming!! 1 XML PARSER 이이이

XML PARSER 이야기

Embed Size (px)

DESCRIPTION

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 자신만의 파서를 구성할 수 있다 - PowerPoint PPT Presentation

Citation preview

Page 1: XML PARSER  이야기

XML Programming!! 1

XML PARSER 이야기

Page 2: XML PARSER  이야기

XML Programming!! 2

XML Parser 의 종류

SAX (The Simple API for XML)

DOM (Document Object Model)

.

Page 3: XML PARSER  이야기

XML Programming!! 3

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

Page 4: XML PARSER  이야기

XML Programming!! 4

SAX(The Simple API for XML) XML-Dev mailing list 회원들의 제안

현재 Version 2.0 (2000.5)

Parser 의 상호간에 표준 API 필요성 제기

Event-based API 제공

Page 5: XML PARSER  이야기

XML Programming!! 5

DOM(Document Object Model)

W3C 에서 제안 현재 Level 2.0(2000.11), Level 3.0

진행중 HTML, XML 문서에 대한 표준 Interface

정의 JavaScript 의 document 객체

Page 6: XML PARSER  이야기

XML Programming!! 6

DOM( 계속 )

XML 문서의 객체와 인터페이스 포함 XML 문서에 대한 프로그램할 수 있는

interface 제공 인터페이스에는 문서의 논리적구조와 접근 방법에 대한 tree-based API 제공

Page 7: XML PARSER  이야기

XML Programming!! 7

XML 문서 Tree

<library>

Document

<item> <item>

<?xml version="1.0"?><library> <!-- 주석 --> <item type="book"> 책 제목 </item>

<item type="cd"> CD 제목 </item></library>

<?xml version="1.0"?><library> <!-- 주석 --> <item type="book"> 책 제목 </item>

<item type="cd"> CD 제목 </item></library>

"book"

type

“cd“

"CD 제목 "“ 책 제목 "type

“ 주석 "

<?xml version="1.0"?>

Page 8: XML PARSER  이야기

XML Programming!! 8

Parser 비교

SAX Event-based API

• 전체 Tree 를 만드는 것이 아니라 등록된 Event 의 Callback함수를 만들어 사용

장점• 대용량 대규모 문서 처리 가능• 순차적으로 일괄 처리하는 경우에 빠른 처리 가능• 구조자체가 관심사항이 아닌 경우

단점• 문서의 구조를 얻어내기가 힘들다 .• 동일한 구조를 여러 번 반복 사용할 경우 반복해서 parsing 을

해야 한다 .

Page 9: XML PARSER  이야기

XML Programming!! 9

Event-Based

<?xml version=“1.0” …?>< 연구실 이름 = “xmlab">

< 담당교수 > < 이름 > 홍길동 </ 이름 > </ 담당교수 > < 학생 > < 이름 > 이몽룡 </ 이름 > < 과정 > 석사 2 학기 </ 과정 > </ 학생 > </ 연구실 >

Parsing

SAX Parser

화면에 “찾았다”를 출력한다 .

Method

<학생 >을 찾으면 저를 불러 주세요 !!!

“ 찾았다”

Call-Back!!!

Page 10: XML PARSER  이야기

XML Programming!! 10

Parser 의 비교 ( 계속 )

DOM Tree-based API Parsing 후에 Memory 상에 문서전체의 Tree 구조를 만들어

사용 장점

• Tree 구조를 가지므로 처리가 용이하다 .• 몇 번이고 원하는 부분을 추가 및 수정 가능• 문서의 구조가 충실히 보존돼야 하는 경우 (ex:XML Editor..

단점 • 메모리상에 DataStructure 를 만들기 때문에 큰 문서에는

적당하지 않다• DOM 구조를 생성하는데 시간이 오래 걸린다 .

Page 11: XML PARSER  이야기

XML Programming!! 11

Tree-Based

<?xml version=“1.0” …?>< 연구실 이름 = “xmlab">

< 담당교수 > < 이름 > 홍길동 </ 이름 > </ 담당교수 > < 학생 > < 이름 > 이몽룡 </ 이름 > < 과정 > 석사 2 학기 </ 과정 > </ 학생 > </ 연구실 >

DOM Parser

Parsing

DOM Tree 구조

NODE

NODENODE

NODE NODE

Page 12: XML PARSER  이야기

XML Programming!! 12

Parser 의 비교 ( 계속 )

SAX 와 DOM 비교

Page 13: XML PARSER  이야기

XML Programming!! 13

SAX 와 DOM 의 Specification

SAX Interface 형태로 배포

DOM OMG 의 IDL(interface definition language) 로 기술 http://www.w3.org/TR/DOM-Level-2-Core/

Page 14: XML PARSER  이야기

XML Programming!! 14

MS 의 MSXML 파서에서의 SAX

MSXMLVersion

1.0 2.0 2.5 2.6 3.0

Installed with

IE4 IE5 Win2000 MSDN MSDN

DOM O O O O

XSL O O O O

Xpath O O O

SAX

SAX2 O O O

Page 15: XML PARSER  이야기

XML Programming!! 15

새로운 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 지원

Page 16: XML PARSER  이야기

XML Programming!! 16

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>

Page 17: XML PARSER  이야기

XML Programming!! 17

주요 Parsers

Apache Xerces IBM XML4J Oracle XML Parser Sun Microsystems Project X ( !=JAXP) JamesClark’s XP OpenXML MicroSoft’s MSXML …

Page 18: XML PARSER  이야기

XML Programming!! 18

JAXP

JAXP(Java API for XML Processing) SUN 에서 제안한 표준 자바 API

JAXP 의 필요성 각 Vendor 의 Parser 가 각기 조금씩 다른 API 를 제공 J2EE 기반에서 사용할 표준 XML API 필요 JAXP 는 각 Vendor 가 제공하는 Parser 를 사용할 수 있는

추상적인 층 (abstract layer) 를 제공

Page 19: XML PARSER  이야기

XML Programming!! 19

쉬어가는 페이지

쉬어갑니다 !!

Page 20: XML PARSER  이야기

XML Programming!! 20

XML4J(Xerces-J)

IBM TX-Parser 로 연구 시작 Apache Project 에 참여 현재 Apache Xerces-J 를 Test 하고 , 배포 Java 로 쓰여진 대표적인 XML Parser

Page 21: XML PARSER  이야기

XML Programming!! 21

Getting Prepared

Obtaining a Parser http://www.alphaworks.ibm.com/formula/ 로 가서 XML4J

를 Download 한다 .

Make sure that your Java environment JDK 설치 확인 CLASSPATH 에 XMLParser Class 가 설정되었는가 확인

Page 22: XML PARSER  이야기

XML Programming!! 22

XML4J 둘러 보기

Vendor 제공 API org.apache.*

JAXP 지원 API javax.xml.*

DOM API org.w3c.dom.*

SAX API org.xml.sax.*

Page 23: XML PARSER  이야기

XML Programming!! 23

SAX 이야기

[email protected]

이 길 재

Page 24: XML PARSER  이야기

XML Programming!! 24

순 서

Handler 7 가지 Handler 살펴보기

SAX API 살펴보기 3 가지 package 살펴보기

Page 25: XML PARSER  이야기

XML Programming!! 25

Handler 이야기

7 개의 Handler ContentHandler ErrorHandler DTDHandler EntityResolver DefaultHandler DeclHandler LexicalHandler

Page 26: XML PARSER  이야기

XML Programming!! 26

Page 27: XML PARSER  이야기

XML Programming!! 27

EventHandler vs SAXHandler

EventHandler public class Test {

… button.addActionListener(myHandler); ...}

class MyHandler implements ActionListener{ public void actionPerformed(ActionEvent e) { System.out.println(“button click!!!”); } }

Page 28: XML PARSER  이야기

XML Programming!! 28

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 를 만났습니다 !!!") }}

Page 29: XML PARSER  이야기

XML Programming!! 29

ContentHandler

가장 기본이 되는 인터페이스

Document 가 시작되거나 엘리먼트가 시작되는 등의 파싱중 발생되는 거의 대부분의 이벤트를 처리한다 .

Page 30: XML PARSER  이야기

XML Programming!! 30

중요 method public void startDocument()

• Document 가 시작된다는 이벤트가 발생할 때 호출된다 . 즉 parsing 시작에 발생

public void endDocument()• XML 문서의 파싱이 끝날 때 발생하는 이벤트에 호출된다 .

public void startElement()• 엘리먼트가 시작된다는 이벤트가 발생할 때 호출된다 .

public void endDocument()• 엘리먼트가 끝났다는 이벤트가 발생할 때 호출된다 .

public void Characters()• 파싱시 character 를 만났을 때 발생하는 이벤트에 호출된다 .

Page 31: XML PARSER  이야기

XML Programming!! 31

ErrorHandler

입력된 문서가 well-formed 한가 ? 또 valid 한가 ? 등을 검사해 발생하는 에러 이벤트를 처리한다 .

중요 method public void warning()

• 가벼운 경고 이벤트가 발생할 때 호출된다 . 각 벤더의 파서 마다 경고가 발생하는 경우가 다르다 .

public void error()• Valid Parser 에서 valid 하지 않은 문서를 파싱했을 때 발생하는 에러

이벤트에 호출된다 . public void fatalError()

• Well-formed 하지 않은 문서를 파싱할 경우 발생하는 에러 이벤드에 호출된다 .

Page 32: XML PARSER  이야기

XML Programming!! 32

DTDHandler

노테이션 선언이나 파싱되지 않은 엔티티 선언을 만나면 발생하는 이벤트를 처리한다 .

중요 method notationDecl(String name, String pubID, String sysID)

• Notation 선언을 만나면 호출된다 . unparsedEntityDecl(String name, String pubID, String

sysID, String notationName)• unparsedEntityDecl 선언을 만나면 호출된다 .

Page 33: XML PARSER  이야기

XML Programming!! 33

EntityResolver

외부 엔티티를 만났을 때 발생하는 이벤트를 처리한다 . 시스템 식별자를 얻어내는 등의 목적으로 사용한다 .

중요 method public InputSource resolveEntity(String pubID, String

sysID)• 외부 Entity 를 만나면 호출된다 .

Page 34: XML PARSER  이야기

XML Programming!! 34

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".

Page 35: XML PARSER  이야기

XML Programming!! 35

중요 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.

Page 36: XML PARSER  이야기

XML Programming!! 36

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.

Page 37: XML PARSER  이야기

XML Programming!! 37

중요 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

Page 38: XML PARSER  이야기

XML Programming!! 38

DefaultHandler

Interface ContentHandler ErrorHandler DTDHandler EntityResolver

Class DefaultHandler implements ContentHandler,

ErrorHandler, DTDHandler, EntityHandler

Page 39: XML PARSER  이야기

XML Programming!! 39

DefaultHandler

ContentHandler ErrorHandler DTDHandler EntityResolver

MyHandler

Implements

Extends

모든 Handler역할 가능

Page 40: XML PARSER  이야기

XML Programming!! 40

쉬어가는 페이지

쉬어갑니다 !!

Page 41: XML PARSER  이야기

XML Programming!! 41

SAX API 살펴보기

3 개의 Package org.xml.sax

• 기본적인 SAX 의 기능을 기술한 인터페이스와 클래스 , 그리고 예외클래스를 담은 패키지

org.xml.helper• org.xml.sax 패키지의 클래스를 도와주는 기능의 클래스가 담긴 패키지

org.xml.ext• SAX2.0 에서 처음 추가된 기능의 패키지

Page 42: XML PARSER  이야기

XML Programming!! 42

Deprecated

SAX1.0 -> SAX2.0 NameSpace 지원 문제

Deprecated Class

Page 43: XML PARSER  이야기

XML Programming!! 43

기타 Interface 들

XMLReader

Attributes

Locator

XMLFilter

Page 44: XML PARSER  이야기

XML Programming!! 44

기타 Class 들

XMLReaderFactory InputSource

AttributesImpl LocatorImpl XMLFilterImpl

ParserAdapter XMLReaderAdapter NamespaceSupport

Page 45: XML PARSER  이야기

XML Programming!! 45

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)

Page 46: XML PARSER  이야기

XML Programming!! 46

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()); …}

Page 47: XML PARSER  이야기

XML Programming!! 47

잠시 쉬어가기 !!

Page 48: XML PARSER  이야기

XML Programming!! 48

SAX Parser 생성하기

3 가지 생성방법 비교 SAXParser 클래스를 직접 생성해 사용한다 .

• XML4J 에서 가능

SAXParserFactory 를 이용해 SAXParser 를 생성해 사용한다 .• JAXP 에서 제안

XMLReader 로 SAXParser 를 생성해 사용한다 .• SAX 에서 제안

Page 49: XML PARSER  이야기

XML Programming!! 49

XML4J 에서 생성

XML4J 나 Oracle 의 SAXParser 는 클래스 (추상클래스 아님 ) 이므로 직접 생성해 사용가능

Ex:import org.apache.xerces.parsers.SAXParser;

SAXParser mySAXParser = new SAXParser(); mySAXParser.parse(String uri);…

Page 50: XML PARSER  이야기

XML Programming!! 50

JAXP 에서 생성

JAXP 에서는 SAXParser 가 추상클래스이다 . 그러므로 SAXParserFactory 를 이용해서 생성해 사용한다 . Ex:

import javax.xml.parsers.*;... SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance(); SAXParser mySAXParser =

mySAXParserFactory.newSAXParser(); mySAXParser.parse(String uri, new MyDefaultHandler());...

Page 51: XML PARSER  이야기

XML Programming!! 51

SAX 에서 제안하는 방법

Interface 인 XMLReader 를 벤더가 제공하는 SAXParser 를 이용해서 생성하는 것이다 .

Ex:...

// className 은 사용할 parser class 이름 . 가령 // org.apache.xerces.parsers.SAXParser 등 ... XMLReader

myReader=XMLReaderFactory.createXMLReader( java.lang.String className); myReader.parse(String uri);

...

Page 52: XML PARSER  이야기

XML Programming!! 52

직접 매개변수를 넣어 생성하지 않고 시스템 프로퍼티에 설정하는 방법이다 .

Ex ... XMLReader myReader = XMLReaderFactory.createXMLReader(); myReader.parse(String uri);

...

실행방법 (-D 옵션 ) org.xml.sax.driver = org.apache.xerces.parsers

Page 53: XML PARSER  이야기

XML Programming!! 53

인터페이스인 XMLReader 를 직접 구현된 SAXParser로 생성해 사용할 수도 있다 .

Ex:...

XMLReader myReader = new SAXParser(); myReader.parse(String uri);

...

Page 54: XML PARSER  이야기

XML Programming!! 54

Handler 등록하기

SAXParser.setContentHandler(ContentHandler);

SAXParser.setErrorHandler(ErrorHandler)

SAXParser.setDTDHandler(DTDHandler)

SAXParser.setEntityResolver(EntityResolver)