SAX vs DOM l SAX XML students student

  • Slides: 27
Download presentation

SAX vs DOM 파서 l SAX 파서 XML 문서 <students> <student> … </student> </stduents>

SAX vs DOM 파서 l SAX 파서 XML 문서 <students> <student> … </student> </stduents> start. Document() start. Element() characters() end. Element() end. Document() 4

SAX 파서 l 이용 가능 파서 종류 정보 JAXP(Java API for XML Processing) 오라클에서

SAX 파서 l 이용 가능 파서 종류 정보 JAXP(Java API for XML Processing) 오라클에서 제공 http: //docs. oracle. com/javase/tutorial /jaxp/intro/index. html Apache Xalan 아파치 소프트웨어재단에서 제공 http: /xalan. apache. org/ Xerces(Xerces Java Parser) 아파치 소프트웨어재단에서 제공 http: //xerces. apache. org/ MSXML MS에서 제공 http: //www. microsoft. com/ Crimson 파서 아파치 그룹에서 제공 http: //www. apache. org/crimson/ 6

SAX 파싱 l 파싱 구조 <? xml version=“ 1. 0” encoding=“utf-8”? > <students> <student>

SAX 파싱 l 파싱 구조 <? xml version=“ 1. 0” encoding=“utf-8”? > <students> <student> <name>박미영</name> <age>25</age> </student> <name>고소영</name> <age>24</age> </students> start. Document() Event 호출 start. Element() Event 호출 character() Event 호출 end. Element() Event 호출 SAX 애플리케이션 이벤트 핸들러 (Event Handler) end. Document() Event 호출 Error Report Event 호출 § 문서가 파싱될 때, SAX 이벤트가 생성 § 이벤트는 파서에 의해서 생성되고, 애플리케이션에서 정의된 콜백 처 리기 메쏘드로 전달됨 7

SAX 파싱 l SAX 2. 0 API 이용하려면 많은 패키지를 사용해야 함 패키지 용도

SAX 파싱 l SAX 2. 0 API 이용하려면 많은 패키지를 사용해야 함 패키지 용도 org. xml. sax SAX 인터페이스 포함 javax. xml. parsers SAXParser, SAXParser. Factory 클래스 포함 org. xml. sax. helpers SAX API 이용을 위한 helper 클래스 포함 8

SAX 핸들러 l Content. Handler와 Error. Handler 11

SAX 핸들러 l Content. Handler와 Error. Handler 11

SAX 파싱 단계 SAXParser. Factory factory=SAXParser. Factory. new. Instance(); SAXParser sax. Parser = factory.

SAX 파싱 단계 SAXParser. Factory factory=SAXParser. Factory. new. Instance(); SAXParser sax. Parser = factory. new. SAXParser(); Default. Handler를 확장하여 정의된 클래스임 Default. Handler handler = new Custom. SAXHandler(); sax. Parser. parse(new File(“example. xml”), handler); 1. 2. 3. 4. SAXParser. Factory 객체 생성 그 객체로부터 SAXParser 객체 생성 Default. Handler 객체 생성 문서 파싱 12

예제 1 import java. io. File; import java. io. IOException; import org. xml. sax.

예제 1 import java. io. File; import java. io. IOException; import org. xml. sax. SAXException; import org. xml. sax. Attributes; import org. xml. sax. helpers. Default. Handler; public class SAXParsing extends Default. Handler { import javax. xml. parsers. SAXParser. Factory; public static void main(String args[]) import javax. xml. parsers. Parser. Configuration. Exception; { import javax. xml. parsers. SAXParser; String xml. Document = "policies. xml"; Default. Handler handler = new SAXParsing(); SAXParser. Factory factory = SAXParser. Factory. new. Instance(); } try { // 문서를 파싱 SAXParser sax. Parser = factory. new. SAXParser(); sax. Parser. parse(new File(xml. Document), handler); } catch(…) {… }// 예외처리기 명세 13

예제 1(2) import java. io. File; import java. io. IOException; public class SAXParsing extends

예제 1(2) import java. io. File; import java. io. IOException; public class SAXParsing extends Default. Handler { public static void main(String args[]) { String xml. Document = "policies. xml"; Default. Handler handler = new SAXParsing(); SAXParser. Factory factory = SAXParser. Factory. new. Instance(); import org. xml. sax. SAXException; import org. xml. sax. Attributes; import org. xml. sax. helpers. Default. Handler; import javax. xml. parsers. SAXParser. Factory; import javax. xml. parsers. Parser. Configuration. Exception; import javax. xml. parsers. SAXParser; } try { // 문서를 파싱 SAXParser sax. Parser = factory. new. SAXParser(); sax. Parser. parse(new File(xml. Document), handler); } catch(Parser. Configuration. Exception e) { e. print. Stack. Trace(); } catch(SAXException e) { e. print. Stack. Trace(); } catch(IOException e) { e. print. Stack. Trace(); } // 여기에 이벤트 핸들러가 옴 } 14

예제 1(2) public class SAXParsing extends Default. Handler { public static void main(String args[])

예제 1(2) public class SAXParsing extends Default. Handler { public static void main(String args[]) { String xml. Document = "policies. xml"; Default. Handler handler = new SAXParsing(); SAXParser. Factory factory = SAXParser. Factory. new. Instance(); try { // 문서를 파싱 SAXParser sax. Parser = factory. new. SAXParser(); sax. Parser. parse(new File(xml. Document), handler); } catch(Parser. Configuration. Exception e) { e. print. Stack. Trace(); } catch(SAXException e) { e. print. Stack. Trace(); } catch(IOException e) { e. print. Stack. Trace(); } } // end of main // 여기에 이벤트 핸들러가 옴 } public void start. Element(String uri, String simple. Name, String qualified. Name, Attributes a) Element 노드 이벤트 처리 { System. out. print("<"+ qualified. Name); } for(int i = 0; i < a. get. Length(); i++) { System. out. print(" " + a. get. QName(i) + "="" + a. get. Value(i) + """); } System. out. print(">"); public void end. Element(String uri, String simple. Name, String qualified. Name) { System. out. println("</"+ qualified. Name + ">"); } public void characters(char[] ch, int start, int length) Text 노드 이벤트 처리 { String claim. String = new String(ch); System. out. print(claim. String. substring(start, start + length)); } // end of class 15

예제 1(3): 결과 <? xml version="1. 0"? > <policies> <company-domain>http: //www. webhomecover. com</company-domain> <contents-image>contents.

예제 1(3): 결과 <? xml version="1. 0"? > <policies> <company-domain>http: //www. webhomecover. com</company-domain> <contents-image>contents. gif</contents-image> <buildings-image>buildings. gif</buildings-image> <policy type="contents"> <policy-holder>A. Liu</policy-holder> <claims> <claim> <year>2002</year><details>Stolen TV</details> </claims> </policy> <policy type="contents"> <policy-holder>B. Singh</policy-holder> </policy> … 16

SAX 이벤트 처리 이벤트 메쏘드 이벤트 start. Document() 문서의 시작 인식 start. Element(uri, loacl.

SAX 이벤트 처리 이벤트 메쏘드 이벤트 start. Document() 문서의 시작 인식 start. Element(uri, loacl. Name, qualified. Name, attributes) 요소의 시작 인식 characters(text, start, length) 문자 데이터 인식 end. Elementstart. Element(uri, loacl. Name, qualified. Name) 요소의 끝 인식 end. Document() 문서의 끝 인식 processing. Instruction(target, data) 처리 명령어 인식 17

import org. xml. sax. *; import javax. xml. parsers. *; 예제 2(1) import org.

import org. xml. sax. *; import javax. xml. parsers. *; 예제 2(1) import org. xml. sax. helpers. Default. Handler; import java. io. *; public class SAXParser. App { public static void main(String argv[]) { SAXParser. App sax. Parser. App = new SAXParser. App(); sax. Parser. App. parse. Document(); } public void parse. Document() { try { SAXParser. Factory factory = SAXParser. Factory. new. Instance(); SAXParser sax. Parser = factory. new. SAXParser(); Default. Handler handler = new Custom. SAXHandler(); sax. Parser. parse(new File("catalog. xml"), handler); } catch (SAXException e) { } catch (Parser. Configuration. Exception e) { } catch (IOException e) { } 18 }

private class Custom. SAXHandler extends Default. Handler { public Custom. SAXHandler() { } 예제

private class Custom. SAXHandler extends Default. Handler { public Custom. SAXHandler() { } 예제 2(2) public void start. Document() throws SAXException { System. out. println("Event Type: Start Document"); } public void end. Document() throws SAXException { System. out. println("Event Type: End Document"); } public void start. Element(String uri, String local. Name, String q. Name, Attributes attributes) throws SAXException { • • System. out. println("Event Type: Start Element"); uri: 이름 공간 local. Name: 접두어 없는 요소 이름 q. Name: 접두어 포함 요소 이름 요소가 이름공간을 포함하지 않으면, local Name은 q. Name은 동일함 System. out. println("Element Name: " + q. Name); for (int i = 0; i < attributes. get. Length(); i++) { System. out. println("Attribute Name: " + attributes. get. QName(i)); System. out. println("Attribute Value: " + attributes. get. Value(i)); } } public void end. Element(String uri, String local. Name, String q. Name) throws SAXException { System. out. println("Event Type: End Element"); } public void characters(char[] ch, int start, int length)throws SAXException { System. out. println("Event Type: Text"); String str = (new String(ch, start, length)); System. out. println(str); 19 }

private class Custom. SAXHandler extends Default. Handler { public Custom. SAXHandler() { } public

private class Custom. SAXHandler extends Default. Handler { public Custom. SAXHandler() { } public void start. Document() throws SAXException { System. out. println("Event Type: Start Document"); } public void end. Document() throws SAXException { System. out. println("Event Type: End Document"); } public void start. Element(String uri, String local. Name, String q. Name, Attributes attributes) throws SAXException { public void error(SAXParse. Exception e) throws SAXException{ System. out. println("Event Type: Start Element"); System. out. println("Error: "+e. get. Message()); System. out. println("Element Name: " + q. Name); } for (int i = 0; i < attributes. get. Length(); i++) { System. out. println("Attribute Name: " + attributes. get. QName(i)); System. out. println("Attribute Value: " + attributes. get. Value(i)); public void fatal. Error(SAXParse. Exception e) throws SAXException{ } System. out. println("Fatal Error: "+e. get. Message()); } } public void end. Element(String uri, String local. Name, String q. Name) throws SAXException { System. out. println("Event Type: End Element"); } public void warning(SAXParse. Exception e) throws SAXException{ System. out. println("Warning: "+e. get. Message()); public void characters(char[] ch, int start, int length)throws SAXException { System. out. println("Event Type: Text"); String str = (new String(ch, start, length)); } } // end of class Custom. SAXHandler System. out. println(str); } 20 } // end of class SAXParser. App

Output for SAX API Example 21 …

Output for SAX API Example 21 …

XMLStream. Reader 이벤트 24

XMLStream. Reader 이벤트 24

javax. xml. stream. XMLStream. Reader 클래스 메쏘드 Boolean has. Next() 파스 이벤트가 남아 있으면

javax. xml. stream. XMLStream. Reader 클래스 메쏘드 Boolean has. Next() 파스 이벤트가 남아 있으면 true 반환 Int next() 파서 상태를 다음번째 파스 이벤트로 설정하고, 그 이벤트 타입을 반환. Boolean is. Start. Element(), is. End. Element(), is. Characters(), is. White. Space() Qname get. Name() String get. Local. Name() 요소 이름 반환 String get. Text() CHARACTERS의 문자를 반환 Int get. Attribute. Count() Qname get. Attribute(int index) String get. Attribute. Local. Name(int index) String get. Attribute. Value(int index) Index에 위치한 속성 값 반환 String get. Attribute. Value(String namespace. URI, String name) 속성 name의 값 반환 25

import javax. xml. stream. *; javax. xml. stream. events. *; javax. xml. stream. XMLInput.

import javax. xml. stream. *; javax. xml. stream. events. *; javax. xml. stream. XMLInput. Factory; java. io. *; 예제 public class St. AXParser { public void parse. XMLDocument() { try { XMLInput. Factory input. Factory = XMLInput. Factory. new. Instance(); Input. Stream input = new File. Input. Stream(new File("catalog. xml")); XMLStream. Reader xml. Stream. Reader = input. Factory. create. XMLStream. Reader(input); // 파서 생성 while (xml. Stream. Reader. has. Next()) { int event = xml. Stream. Reader. next(); if (event == XMLStream. Constants. START_DOCUMENT) { System. out. println("Event Type: START_DOCUMENT"); } if (event == XMLStream. Constants. START_ELEMENT) { System. out. println("Event Type: START_ELEMENT"); System. out. println("Element Local Name: "+ xml. Stream. Reader. get. Local. Name()); for (int i = 0; i < xml. Stream. Reader. get. Attribute. Count(); i++) { System. out. println("Attribute Local Name: “ xml. Stream. Reader. get. Attribute. Local. Name(i)); System. out. println("Attribute Value: “ xml. Stream. Reader. get. Attribute. Value(i)); } } } catch (Factory. Configuration. Error e) { if (event == XMLStream. Constants. CHARACTERS) { System. out. println("Factory. Configuration. Error" + e. get. Message()); System. out. println("Event Type: CHARACTERS"); } catch (XMLStream. Exception e) { System. out. println("Text: " + xml. Stream. Reader. get. Text()); System. out. println("XMLStream. Exception" + e. get. Message()); } } catch (IOException e) { System. out. println("IOException" + e. get. Message()); if (event == XMLStream. Constants. END_DOCUMENT) { } System. out. println("Event Type: END_DOCUMENT"); } } // end of parse. XMLDocument() if (event == XMLStream. Constants. END_ELEMENT) { System. out. println("Event Type: END_ELEMENT"); public static void main(String[] argv) { } } // end of while St. AXParser stax. Parser = new St. AXParser(); } catch (Factory. Configuration. Error e) { stax. Parser. parse. XMLDocument(); } } 26