DeclHandler Programming using SAX(Simple API for XML)


다음은 JAVA를 사용한 SAX 프로그래밍에 관한 내용입니다.

SAX 1.0의 네 가지 이벤트핸들러 외에 SAX 2.0에 들어오면서 DeclHandler와 LexicalHandler가 추가되었다.

1. DeclHandler 소개
DeclHandler는 DTD의 XML 문서 구조 선언과 관련된 이벤트 핸들러이다. 예를 들어 엘러먼트 선언이나 애트리뷰트 선언과 같은 선언문을 위한 이벤트 핸들러이다.

DeclHandler는 다음과 같은 네 개의 이벤트 메소드를 제공한다.
  • void elementDecl (String name, String model)
  • void attributeDecl (String eName, String aName, String type, String mode, String value)
  • void internalEntityDecl (String name, String value)
  • void externalEntityDecl (String name, String publicId, String systemId)
elementDecl() 메소드는 DTD 엘리먼트 선언 시 발생하는 이벤트로써 엘리먼트의 이름과 엘리먼트 내용을 인자로 갖는다.

attributeDecl() 메소드는 애트리뷰트 선언에서 발생하는 이벤트이다. 첫 번째 인자는 애트리뷰트를 갖는 엘리먼트의 이름을 나타내고, 두 번째 인자는 애트리뷰트의 이름을 나타낸다. 세 번째 인자는 애트리뷰트가 갖는 값의 타입을 나타내며, 네 번째 인자는 #REQUIRED와 #IMPLIED와 같은 애트리뷰트의 발생 여부를 나타낸다. 마지막 인자는 애트리뷰트의 기본 값을 갖는 인자이다.

internalEntityDecl() 메소드는 내부 엔티티 선언에서 발생하는 이벤트 메소드로써, 인자로 엔티티의 이름과 값을 갖는다.

externalEntityDecl() 메소드는 외부 엔티티 선언에서 발생하는 이벤트 메소드로써, 첫 번째 인자로 엔티티의 이름을 가지며 두 번째와 세 번째 인자는 외부 엔티티의 URI 값을 나타낸다.


2. DeclHandler의 구현
DeclHandler를 구현하기 위해서는 DeclHandler에 정의되어 있는 네 개의 이벤트 메소드를 모두 구현(implements)해야 한다.

DeclHandler도 앞서 다루었던 LexicalHandler와 마찬가지로 XMLReader 객체의 setProperty() 메소드를 이용해서 등록한다. DeclHandler를 등록하기 위한 속성 이름은 "http://xml.org/sax/properties/declaration-handler"이다.


다음은 DeclHandler를 구현한 예이다.
- SAXSample.dtd
<!ELEMENT booklist (book+)>
<!ELEMENT book  (name, authors, page, publish?, price)>
<!ELEMENT name  (#PCDATA)>
<!ELEMENT authors  (author+)>
<!ELEMENT author  (#PCDATA)>
<!ELEMENT page  (#PCDATA)>
<!ELEMENT publish  EMPTY>
<!ELEMENT price  (#PCDATA)>
 
<!ATTLIST book  isbn ID #REQUIRED>
<!ATTLIST name  outpage CDATA #IMPLIED>
<!ATTLIST publish  year CDATA #IMPLIED
    month CDATA #IMPLIED
    day CDATA #IMPLIED>
<!ATTLIST price  unit CDATA "won">
<!ENTITY bookname "XML과 XML Web Services">

- SAXSample.xml
<?xml version="1.0" encoding="euc-kr" standalone="no"?>
<!DOCTYPE booklist SYSTEM "SAXSample.dtd">
<!-- 책 정보에 관한 XML -->
<booklist>
      <book isbn="h0-596-00762-0">
            <name outpage="ProgrammingNETComponents.gif">
                  &bookname;
            </name>
            <authors>
                  <author>Juval Lowy</author>
            </authors>
            <page><![CDATA[ 648 ]]></page>
            <publish year="2005" month="06" />
            <price unit="won">51300</price>
      </book>
</booklist>

import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.ext.*;
public class ExtDeclHandler {
      public static void main(String[] args) {
            try {
                  String DECL_URI = "http://xml.org/sax/properties/declaration-handler";
                  SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
                  SAXParser saxParser = saxParserFactory.newSAXParser();
                  XMLReader xmlReader = saxParser.getXMLReader();
   
                  ImplHandler handler = new ImplHandler();
                  xmlReader.setProperty(DECL_URI, handler);
                  xmlReader.parse("SAXSample.xml");  
            } catch(Exception e) {
                  e.printStackTrace(System.err);
            }
      }
}
class ImplHandler implements DeclHandler {
      public void elementDecl(String name, String model) {
            System.out.println("<!ELEMENT " + name + " " + model + ">");
      }
      public void attributeDecl(String eName, String aName, String type, String mode, String value) {
            System.out.print("<!ATTLIST " + eName + " " + aName + " ");
            System.out.print(type + " " + mode + " " + value + ">\n");
      }
      public void internalEntityDecl(String name, String value) {
            System.out.println("<!ENTITY " + name + " \"" + value + "\">");
      }
      public void externalEntityDecl(String name, String publicId, String systemId) {
            System.out.print("<!ENTITY " + name + " ");
            System.out.print(publicId + " " + systemId + ">\n");
      }
}

- Output
<!ELEMENT booklist (book+)>
<!ELEMENT book (name,authors,page,publish?,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT authors (author+)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT page (#PCDATA)>
<!ELEMENT publish EMPTY>
<!ELEMENT price (#PCDATA)>
<!ATTLIST book isbn ID #REQUIRED null>
<!ATTLIST name outpage CDATA #IMPLIED null>
<!ATTLIST publish year CDATA #IMPLIED null>
<!ATTLIST publish month CDATA #IMPLIED null>
<!ATTLIST publish day CDATA #IMPLIED null>
<!ATTLIST price unit CDATA null won>
<!ENTITY bookname "XML과 XML Web Services">


Reference : 소설같은 XML & XML Web Services





신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Proneer

댓글을 달아 주세요


티스토리 툴바