반응형
출처: http://kr.blog.yahoo.com/kwon37xi/folder/3381246.html
Java와 XML 2판의 내용정리이다.
책을 보지 않으면 이 내용을 이해할 수 없을 수 있다.

SAX 파서는 XML 문서를 순차적으로 분서하는데 문서를 분석하는 동안 시작 태그나 속성, 종료 태그, 텍스트 데이터 등을 만나면 각 구성 요소를 처리하는 메소드를 호출한다.
이때 메소드를 호출하는 구성요소를 만나는 것이 이벤트가 된다. 즉, SAX 파서가 시작태그를 만나는 것이 하나의 이벤트이고 속성을 만나는 것이 또 다른 이벤트가 된다. 그리고 각 구성요소를 처리하는 메소드를 호출하는 것은 이벤트를 처리한다라고 표현하며, 호출되는 메소드를 콜백(callback) 메소드라고 부른다.

SAX Parser

http://xml.apache.org 에서 Xerces 파서를 구할 수 있다.

SAX 클래스는 org.xml.sax 구조로 패키징되어 있다. 최소한 org.xml.sax.XMLReader 클래스가 있어야 한다.

SAX 공식 홈 : http://wwww.saxproject.org

SAXReader

SAX 사용의 시작은 org.xml.sax.XMLReader 의 객체를 얻는 것이다.
// 파서 클래스 지정. 여기서는 아파치 Xerces
private String parserClass="org.apache.xerces.parsers.SAXParser";

// 파싱에 사용할 XMLReader 객체 생성
XMLReader reader = XMLReaderFactory.createXMLReader(parserClass);

  • XMLReader 의 객체는 재사용이 가능하지만 한 번에 한개의 XML 파일만을 파싱해야한다.

XML 문서 파싱

XMLReader 객체의 parse(InputSource) 혹은 parse(String URI)로 파싱한다. InputSource 사용권장.

InputSource is = new InputSource(new FileInputStream(new File(xmlURI)));

// 필수적으로 SystemID를 설정해야 한다.
// SystemID는 XML 문서의 URI이다.(파일의 경우 파일의 경로)
is.setSystemId(xmlURI);

// 파싱
reader.parse(inputSource);
  • 항상 시스템 ID를 설정해야만 한다!!
  • SystemID는 XML문서의 URI이다. 파일의 경우는 파일의 경로를 의미한다.

Handler 등록

핸들러는 SAX 파서가 문서를 순차적으로 분석하는 동안 발생한 이벤트에 대해 호출할 메소드를을 가진 클래스 객체이다.

  • XMLReader.setContentHandler()
  • XMLReader.setErrorHandler()
  • XMLReader.setDTDHandler()
  • XMLReader.setEntityHandler()


  • 모든 핸들러는 throws SAXException 을 해야 한다.

Content Handler

  • 요소 등 XML의 내용을 만났을때 호출되는 콜백 메소드를 가지는 클래스.
  • ContentHandler 인터페이스 구현

public void setDocumentLocator(Locator locator)

  • 분석중인 문서의 위치 정보를 가진 Locator의 객체 생성. Locator 객체의 getLineNumber(), getColumnNumber() 메소드들로 이벤트가 발생한 위치를 알아낼 수 있다.
  • 이벤트의 위치는 실제 처리중인 분석과정에만 유효. Locator는 ContentHandler를 구현한 클래스 범위 내에서만 사용되어야 한다! Locator를 ContentHandler 의 인스턴스 멤버로 등록한다.

public void startDocument() throws SAXException

  • 문서 시작시 호출되는 콜백 메소드.
  • 모든 핸들러를 포함하여 가장 처음에 호출.(setDocumentLocator() 제외)

public void endDocument() throws SAXException

  • 문서 분석이 끝날 때 호출되는 콜백 메소드
  • 모든 핸들러를 포함하여 가장 나중에 호출.

public void processingInstruction(String target, String data)

  • 처리지시어(<? --- ?>)를 처리한다.
  • XML 데이터를 사용하는 실제 애플리케이션은 이 메소드로 처리 지시어를 받아 변수 값을 설정하거나 특정한 처리 과정을 수행하는 메소드를 실행한다.
  • <?xml version="1.0"?> 이 부분은 전달되지 않는다.

네임스페이스 매핑

  • 네임스페이스를 선언하는 xmlns 를 만나면 발생
  • public void startPrefixMapping(String prefix, String uri)
  • public void endPrefixMapping(String prefix)
  • 프로그래밍 패턴

    private Map namespaceMappings = new HashMap();
    
    public void startPrefixMapping(String prefix, String uri) {
    	// 시각적인 이벤트는 발생하지 않는다.
    	namespaceMappings.put(uri, prefix);
    }
    
    public void endPrefixMapping(String prefix) {
    	// 시각적인 이벤트는 발생하지 않는다.
    	for (Iterator i = namespaceMappings.keySet().iterator(); i.hasNext(); ) {
    		String uri = (String)i.next();
    		String thisPrefix = (String)namespaceMappings.get(uri);
    		if (prefix.equals(thisPrefix)) {
    			namespaceMappings.remove(uri);
    			break;
    		}
    	}
    }
    

public void startElement(String namespaceURI, String localName, String qName, Attributes atts)

  • 요소가 시작될 때 호출
  • qName 은 네임스페이스 접두어가 있다면 그것을 이름에 포함한다.
  • atts 는 요소의 속성들을 배열로 가지고 있다.

public void endElement(String namespaceURI, String localName, String qName, Attributes atts)

  • 요소가 닫힐 때 호출

public void characters(char[] ch, int start, int length)

  • 요소의 텍스트 데이터
  • ch 배열의 start 인덱스부터 length 길이 만큼 만이 데이터이다!!

public void ignorableWhitespace(char[] ch, int start, int length)

  • 무시 가능한 공백문자가 올 경우 호출
  • DTD나 스키마가 없으면 호출되지 않는다. DTD나 스키마에서 무시가능한 공백문자를 지정하기 때문이다.

public void skippedEntity(String name)

  • 파서가 엔티티를 처리하지 않을 때 호출
  • 실제 이 메소드가 호출되는 경우는 거의 없다.(Xerces는 절대 호출하지 않는다.)
  • 이 콜백을 수행하면 엔티티 참조의 앞의 앰퍼샌드와 뒤의 세미콜론을 포함하지 않는 엔티티 참조를 매개변수로 전달한다.

ErrorHandler

  • 파싱중 오류가 발생하면 호출되는 핸들러
  • ErrorHandler 인터페이스 구현

public void warning(SAXParseException ex)

  • 경고

public void error(SAXParseException ex)

  • 치명적이지 않은 오류

public void fatalError(SAXParseException ex)

  • 치명적 오류
  • 파싱을 중지하는게 낫다.

반응형

중앙대학교 컴퓨터공학과 자바 동호회 JSTORM   http://www.jstorm.pe.kr  최진호님이 작성하신 문서입니다.

JDOM을 이용한 Java/XML 프로그래밍 자료입니다.
반응형

본 문서는 http://cafe.naver.com/specialj.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1336 을 참조 

DOM 문서 객체 모델 [-, document object model]
본문
브라우저를 통한 확장성 생성 언어(XML) 문서의 상호 연동을 위한 객체 기반의 문서 모델. 플랫폼과 언어 면에서 중립적인 인터페이스로서 프로그램과 스크립트에 의한 문서의 내용˙구조˙종류의 동적인 접근과 변경이 가능하며, 스크립트나 프로그램 언어에 웹 페이지를 연결해 준다. 웹 페이지를 조작˙생성하기 위해 사용되는 속성, 방법 및 이벤트가 객체를 구성하는데, 이러한 객체들은 대부분의 웹 브라우저에서 스크립트 언어를 통해 접근할 수 있다.

 

 

 

JDOM [Java Document Object Model]
본문
자바에 최적화확장성 생성 언어(XML) 데이터 가공을 위해 만든 개방 소스 라이브러리. 자바 기반의 개발 도구로, 좀 더 직관적인 방법으로 XML을 조작할 수 있는 개방 소스 응용 프로그램 인터페이스(API)이며, SAX(Simple API for XML)와 문서 객체 모델(DOM)과도 상호 연동되고, SAX와 DOM의 장점만을 골라 만든 클래스인터페이스를 제공한다. JDOM은 W3C DOM과 유사하지만 DOM을 기반으로 설계되거나 DOM을 모델로 하지 않은 대안적인 문서 객체 모델로, 차이점은 DOM은 언어 중립적으로 설계되었고, 초기에 HTML 페이지의 자바 스크립트 가공에 주로 이용되었던 반면, JDOM은 자바 전용으로 설계되어 메소드 오버로딩(method overloading), 컬렉션(collection), 리플렉션(reflection), 친숙한 프로그램밍 환경 등 자바의 기본 기능들을 활용한다는 데 있다.

 

SAX

[simple API for XML, simple application program interface for Extensible Markup Language]

본문
확장성 생성 언어(XML)로 된 웹 파일을 해석할 수 있게 해 주는 응용 프로그램 인터페이스(API). XML을 해석하기 위해 문서 객체 모델(DOM) 대신 사용할 수 있는 대안으로 DOM보다 간단하고 대량의 파일용으로 적절하나 데이터 내용 운용면에서는 능력이 떨어진다. 또한 이벤트형 인터페이스이벤트를 제어하고 상황을 처리하여 XML 파서(parser)와 함께 사용된다.

 

JAX [Java API for XML]
본문
확장성 생성 언어(XML) 데이터 처리를 위한 자바 응용 프로그램 인터페이스. XML 파서(paser)를 얻기 위한 표준 인터페이스 JAXP(Java API for XML Procession), 메세징 프로토콜의 기초를 제공하는 JAXM(Java API for XML Messaging), 단순 객체 접근 프로토콜(SOAP) 스팩(제품 명세)에 따른 메시지를 만들고 소비하도록 하는 SAAJ(SOAP with Attachments API for Java), XML을 기반으로 한 자바 원격 프로시져 호출 응용 프로그램 인터페이스(API)인 JAX/RPC(Java API for XML-based RPC), XML 레지스터가 저장한 퍼블리싱된 웹 서비스 정보를 액세스하는 방법을 제공하는 JAXR(Java API for XML Registries)로 구성된다.

 

자바 XML팩 [Java XML Pack]
본문
선 마이크로시스템스사가 2001년 12월에 발표한 자바 언어(환경)를 확장성 생성 언어(XML)나 웹 서비스에 대응시키는 응용 프로그램 인터페이스(API)를 정리한 패키지. 자바 개발자에게 프로그램의 XML 대응이나 웹 서비스의 구축에 필요한 기술 제공을 목적으로 한다. JAXP(Java API for XML Processing), JAXM(Java API for XML Messaging), JAXB(Java API for XML Data Binding) 등 몇 개의 XML 관련 패키지를 통합한 것이다. 향후 자바 XML 팩에는 문서 처리, 데이터 처리 등 다른 XML 기술도 수록될 예정이다.

 

 

 

그외에 웹로직으로 알려진 BEA Systems의 스택스(StAX: Streaming API for Java)가 있다.


+ Recent posts