'XML'에 해당되는 글 3건

  1. 2008.12.23 이클립스에서 xml 파일만 build시 누락될 때... (2)
  2. 2008.05.26 xml dtd
  3. 2008.05.26 SAX(Simple API for XML)

원래 빌드가 잘 되던 이클립스 프로젝트가 어느 순간 갑자기

설정해 놓은 build path로 xml 파일만 build가 될 때 누락되었습니다.

java파일들도 컴파일 잘 되서 넘어가고

.properties 파일도 잘 되서 넘어가고

.txt 파일도 넘어가는데 유독 xml 파일만 안 넘어갑니다..

원래 잘 되었었기 때문에..

뭔가 설정에 변화가 있었나 싶어서 여기저기 찾아봤는데 도무지가 찾을 수가 없었습니다.

윈도우 파일 시스템이 꼬였나.. 이 생각까지 했지만 여러개의 프로젝트가 모두 같은 현상이라

이클립스 설정 뭔가가 문제다 싶었거든요..

더군다나 tptp를 한번 설치해본 이후 이런 현상이라..더더욱..

대략 4시간을 고생하다가 어느분께서 작성해 놓으신 글을 보게 되었습니다.

http://www.potatosoft.com/tt/235


역시 설정 문제가 맞긴 맞는데..

Window->Preference->Java->Compiler->Building에 가면

아래쪽에 Output Folder 항목에 Filtered resources 라는 항목이 있습니다. 여기에

.xml이 들어가 있습니다.. 아오....

이거 삭제해주고 프로젝트 클린 후 다시 빌드해주면 해결됩니다.

와.... 진짜 겨우 살았네요 --;


Posted by 용식

xml dtd

XML & WebServices 2008.05.26 10:59

출처 : http://kr.blog.yahoo.com/kwon37xi/1236311.html 

(더 좋은 화면 있습니다.^^;)


DTD ?

  • Document Type Definition - 문서 형 정의
  • DTD 선언은 데이터 안에 포함하거나 별도의 다른 문서로 존재할 수 있다. DTD는 XML 데이터의 구조와
    내용을 나타내는 규칙을 정의한다. 단 하나의 DTD만이 XML 문서와 데이터 객체에 연관될 수 있다.

  • 내부/외부 서브셋
    1. 내부 서브셋 : DTD 선언을 XML 데이터 내부에 포함.
    2. 외부 서브셋 : DTD 선언이 다른 문에서 위치. .dtd 파일
    3. 내부 서브셋에 있는 DTD 선언은 외부 서브셋에 있는 선언보다 우선순위가 높다. 유사한 선언이
      양쪽에 존재할 때, 내부 서브셋의 선언이 사용된다.

XML과 DTD 연결

  • DOCTYPE 선언을 이용한다.
  • XML문서내에 DOCTYPE선언은 단 한번만 나올 수 있다.
  • XML 선언 바로 다음에 나와야 한다.

SYSTEM


  • doc_element란 문서의 root 요소를 의미한다.
  • 내부 서브셋은 선택적이다.
  • SYSTEM 키워드는 DTD의 위치를 명시적으로 가리키는데 사용한다. URL형식을 사용한다.


  • 
    
  • 반드시 파일이나 지정된 URL에 접근 가능한 권한이 있어야만 한다.

PUBLIC

  • PUBLIC 키워드는 내부 시스템과 SGML 애플리케이션에서 사용하도록 제한되어 있다.


  • PUBLIC 위치에서 DTD를 검색하는 것은 DTD를 애플리케이션(파서)이 알아서 찾아서 처리하라는 뜻이다.
  • 보통 PUBLIC 식별자와 함께 SYSTEM 스타일의 위치 지정. PUBLIC 위치를 사용할 수 없을 경우 대체 위치 제공.

PUBLIC 위치에서 DTD를 찾지 못하면 SYSTEM 위치에서 찾는다. SYSTEM 키워드는 내부적으로 암시되어 있다.

내부 서브셋







...


DTD 선언

  • DTD 선언은 형태로 한다.
  • 공백문자는 여러개를 사용해도 된다.
  • 단, 에서 !와 keyword 사이에는 공백이 없다.

DTD 키워드

키워드 설명
ELEMENT XML 요소 형이름과 허가된 하위 요소들(자식)을 기술한다.
ATTLIST XML 요소 속성 이름과 허가된 또는 기본 속성 값을 기술한다.
ENTITY 특별한 문자 참조. 텍스트 매크로, 외부 소스의 반복되는 내용을 기술한다.
NOTATION 외부의 비 XML 내용(예를 들어, 바이너리 이미지 데이터)과 그 내용을 처리하는 외부 애플리케이션 기술.

* ELEMENT, ATTLIST, ENTITY가 핵심이다.

요소 형(ELEMENT) 선언

아래 두 가지 형태의 선언이 있다.


  • name : 요소의 이름.
  • content_category와 content_model은 이 요소가 포함할 수 있는 내용의 종류를 의미한다.

Content Category

어떤 데이타가 올 수 있는가?

Any



  • Well-Formed 인 XML 아무거나 올 수 있다. 유효성 검사를 무력화 시키므로 사용하지 말 것.

Empty



  • 속성 이외에는 아무것도 올 수 없다. HTML의 img 태그 등이 그 예이다.


  • 
    


Content Model



  • 요소 선언에서 내용 모델(Content Model)은 요소 형의 구조와 내용을 기술하기 위해 사용한다.
  • 쉽게 말하면, 요소안에 어떤 다른 요소가 어떤 순서로 몇 개 올수 있는가. 아니면 텍스트만 올 수 있는가 등을 지정한다.
  • 내용 모델은 세가지로 나눌 수 있다.
    1. Text Only : 문자 데이타만 올 수 있다. 자식 요소는 올 수 없다.
    2. Element Only : 자식 요소만 올 수 있다. 자식 외부에 텍스트를 둘 수 없다.
    3. Mixed : 자식 요소와 텍스트 혼합.
  • ANY나 EMPTY 카테고리에서 내용 모델이 필요없다.
  • cardinality 란 내용 모델이 몇개 반복 될 수 있는지 결정하는 것이다.

  • 순차와 선택 리스트
    1. 순차 리스트 : 자식 요소들이 지정된 순서대로 나와야 한다. 자식 요소들의 이름을 구분하기 위해 쉼표(,)를 사용.

      
      
    2. 선택 리스트 : 지정된 자식 요소들 중에서 단 한개만 나타날 수 있다.

      
      

Text-Only(PCDATA)

  • #PCDATA로 지정한다.
    
    

문자열만 올 수 있다.

PCDATA 카테고리를 가진 요소는 실제 데이터와 엔티티 참조만을 허용한다.


어쩌구 저쩌구 메롱~~


Eelement-Only

자식 요소만을 포함한다. 지정된 자식 요소만을 포함할 수 있다. 자식 요소의 외부에 텍스트를 포함할 수 없다.


다음과 같다. 결코 자식요소 외부에 문자열이 올 수 없다.

  haha
  
  some message
  hi~
  


혼합 내용


  • 일반 텍스트와 a_child_element, another_child 요소가 올 수 있다. 카디널리티 연산자로 *를 지정했기 때문에 순서 없이 올 수 있다.

  • #PCDATA 키워드는 사용할 때마다 항상 내용 모델의 첫째 항목으로 나타나야 한다. 그리고나서 자식 요소 형 이름이 나와야 한다.
  • HTML의 body 태그가 대표적인 혼합 내용 요소이다.

순차/선택 리스트 복합 사용


  • Mr, Ms, Dr, Rev 요소 중의 하나만 먼저 나오고 그 다음 FirstName, MiddleName, LastName 이 순서대로 나오고, 다시 Jr, Sr, III 요소 중의 하나만 마지막으로 나올 수 있다.
    
      
      길동
      중간이름도 있나?
      
      
    
    

카디널리티 연산자

  • 카디널리티 연산자는 내용 모델에서 자식 요소들이 얼마나 많이 나타날 수 있는지를 정의한다.
카디널리티 연산자 설명
없슴 카디널리티 연산자가 없으면 자식 요소의 인스턴스가 단 한번, 필히! 나타남.
? 0번 또는 1번. 없거나 하나만 있거나.
* 0번 또는 여러번.
+ 1번 또는 여러번.

속성(ATTRIBUTE) 선언


  • elementName은 속성들을 포함하고 있는 요소의 이름이다.
  • attrName은 속성의 이름이다.
  • attrType은 속성의 형이다.
  • attrDefaultN 은 속성이 반드시 필요한지 아닌지 여부.

속성의 디폴트 값

속성 디폴트 설명
#REQUIRED 속성은 요소의 모든 인스턴스에 반드시 나타나야 한다.
#IMPLIED 속성은 선택적이다. 있어도 좋고 없어도 좋고..
#FIXED(디폴트값과 함께 사용) 속성은 선택적이다. 만약 속성이 사용되면 반드시 디폴트값과 일치해야한다. 속성이 없어도 파서가 디폴트 값을 제공해 줄 수 있다.
디폴트값(키워드 없이 사용) 속성은 선택적이다. 속성이 사용되면 그 값을 따르고, 속성이 사용되지 않으면 파서가 디폴트 값을 제공해 줄 수 있다.

REQUIRED




IMPLIED


  • its_attr 속성은 선택적이다.
  • #IMPLIED에서는 디폴트 값 지정을 불허한다.

FIXED

  • 속성의 값을 특정값으로 고정시킨다.
    
    
    
  • Doc 요소에 version 속성이 있건 없건간에 무조건 "1.00"의 version 속성이 있다고 간주한다.
  • 만약 version 속성에 "1.00"이외의 값이 들어가면 유효하지 않은 XML 문서이다.
    haha
    혹은..
    haha
    

  • version 속성의 값을 하나의 값으로 제한하면서 모든 요소의 모든 인스턴스에서 사용되지 않아도 되게 하려면 #IMPLIED 키워드를 가진 열거 속성형을 사용하면 된다.
    
    
    

속성 형(Type)

10가지 형이 있다.

CDATA(문자 데이터)

  • 일반 텍스트
    
    
  • AnElement의 속성 its_attr은 문자열 데이터를 가지며 필수적으로 있어야한다.
    ...
    
  • CDATA 속성값에는 외부엔티티 참조를 사용할 수 없다.
  • 내부에 정의된 엔티티 참조는 사용할 수 있다.(<, >, &, &apos;, ")
  • 문자 참조는 사용할 수 있다.(A; 등..)
  • "<" 문자는 올 수 없다. <로 대체하라.

열거형

  • 지정된 텍스트 문자열 중의 하나만을 속성 값으로 사용한다.
    
    
    
  • 실 사용예
    
      John
      Q
      Public
    
    

ID 속성 형(요소 식별자)




  • ID 형을 사용하는 속성은 요소의 인스턴스에서 유일하게 식별할 수 있는 이름을 제공한다.
    ID 속성값은 XML 이름 규칙에 따라야 하고, 그 값은 사용하는 문서에서 유일해야 한다.
  • 값은 숫자로 시작할 수 없다. 문자 + 숫자 형은 가능하다.
  • 각 요소 형에서 ID는 단 한 개만 사용할 수 있다.
  • 이 형의 모든 속성은 #IMPLIED 혹은 #REQUIRED로 선언해야 한다.

IDREF / IDREFS 속성 형 (요소 사이의 관계)




혹은, 한 책에 대한 저자가 여러명 일 수 있으므로



  • IDREF 속성 값은 적합한 XML 이름이어야 하고, 같은 문서 내의 ID 속성 값과 일치해야 한다.
  • 동일한 ID에 대해 여러 IDREF 링크들이 허용된다.
  • IDREFS는 한 속성에 여러 ID 값들을 공백으로 구분하여 가질 수 있다.

NMTOKEN, NMTOKENS 속성 형


  • NMTOKEN은 CDATA와 동일하지만, 공백 문자가 올 수 없다.
  • NMTOKENS는 NMTOKEN이 한 속성에서 공백으로 구분되어 여러개 있는 것이다.
  • 열거형과 CDATA형의 중간 형태.
    ...
    
    
    

ENTITY/ENTITIES 속성 형

  • ENTITY의 이름을 속성의 값으로 지정한다. 엔티티의 이름을 지정할 때 "&"와 ";"는 뺀다.
  • ENTITIES는 공백으로 구분하여 여러개의 엔티티를 지정할 수 있다.

NOTATION 형


  • NOTATION 속성 값은 반드시 적절한 XML이름이어야 하고, 동일한 DTD내의 선언과 일치해야 한다.
  • 각 요소 형에 대해 NOTAION 속성 하나가 존재할 수 있다.
  • 이 속성 형은 EMPTY 요소와 함께 사용 될 수 없다.

Notation : 비 XML 데이터

  • 텍스트가 아닌 바이너리 데이터 등을 다루기 위한 선언
  • Notation은 XML 어플리케이션에서 파싱되지 않은 엔티티나 다른 비-XML 데이타를 다루기 위해 사용된다.
  • 기본 선언 형태

    
    
    
    

일반 엔티티(ENTITY)

  • 엔티티는 엔티티가 나오면 그 부분을 지정되 다른 문자열로 대체한다.
  • 엔티티의 대체 문자열은 Well-Formed XML이어야 한다.
    
    
  • 엔티티는 직접적으로 또는 간접적으로 자신의 이름을 참조할 수 없다. (즉, 재귀적인 참조가 허용되지 않는다.)
  • 엔티티에 속성 값의 끝 구분문자(" 혹은 ')를 포함할 수 없다.
  • 엔티티를 참조하려면 &엔티티이름;와 같이 해야한다.
    
    
    	
    	
    
    	
    	
    	
    	
    ]>
    
    
    	&Disclaimer;
    
    

매개 변수 엔티티


  • 매개 변수 엔티티는 DTD에서만 사용된다.
    
    
    
    
    
    
    
    
    

독립 문서 선언


  • standalone 속성을 통해 XML 프로세서가 DOCTYPE 선언을 해석하는 방법 제공.
  • yes : 문서는 자체에 포함되어 있으며 다른 데이터를 요구하지 않는다.
  • no : 문서는 외부 DTD에 포함된 마크업을 사용한다.

DTD의 제약

  1. 비 XML 구문이다.
  2. DTD는 확장할 수 없다.
  3. 오직 하나의 DTD만이 문서와 결합할 수 있다.
  4. DTD는 XML 네임스페이스를 잘 지원하지 않는다.
  5. 매우 약한 데이터 형을 사용한다.
  6. 객체 지향 형의 개체 상속을 하지 못한다.
  7. 내부 서브셋을 사용하여 외부 서브셋을 무시할 수 있다.
  8. DOM을 지원하지 않는다.
  9. 상대적으로 오래되었다.
Posted by 용식
TAG DTD, XML
SAX(Simple API for XML)
DOM & SAX

DOM은 XML 문서를 트리 구조로 취급 하므로 다루기 용이하다. 그러나 XML 문서 전체를 읽어 트리로 조립하기에 커다란 XML 문서를 다루는기에는 용이 하지 못한 부분도 있다.
그래서 XML 문서를 다루는 방법으로 DOM과 함께 SAX라고 불리는 방법이 주로 사용 된다.


DOM은 XML 문서 전체를 읽어 들이므로 문서안을 찾으면서 문서의 일부분에 대해 조작을 할 수 있지만 문서 전체를 읽음 으로서 효율성은 저하
SAX의 경우 앞부분 부터 순서대로 읽어 들여 처리하므로 요소나 텍스트를 단순히 추출하는것은 간단하나 문서의 일부분을 조작하는 것은 DOM에 비해 복잡하다.


XML 문서를 앞에서 부터 읽어 들여 거기에 등장하는 요소나 텍스트에 따라 처리를 하는 구조
SAX에서는 XML 문서내 요소의 시작이나 종료를 찾거나, 텍스트가 출현 했을때 핸들러라고 불리는 구조로 그 뜻을 통지한다.
Java의 경우 핸들러를 나타내는 클래스에 문서의 각 부분을 처리하는 메소드를 정의해 두면 문서의 해당 부분이 나타 났을때 메소드가 호출되어 처리된다.
SAX에는 1998년에 규격이 확정된 SAX1과 2000년에 확정된 SAX2가 있다. SAX2는 SAX1에 네임스페이스 기능이 추가 되었다.


앞에서 본 것과 같이 어떤 부분을 찾았을때 자동으로 처리가 행해지는 구조를 이벤트 처리 방식(Event-Driven)이라고 한다. SAX에서는 핸들러를 등록해 두는데 이는 자동으로 호출 된다.
어떤 이름의 메소드가 호출되는가라고 하는 것은 SAX의 규격으로 정의되어 있다.
결국 SAX로 XML 문서를 다루는 애플리케이션을 개발 할 때는 DefaultHandler 클래스를 상속한 핸들러클래스를 작성 하여 적절한 메소드를 기술한다. 그런다음 이 핸들러를 XML 파서에 등록 한다.  


핸들러 소개

  --> startDocument()
            --> startElement()
 
                          --> startElement()


승용차 --> charaters()

--> endElement()

--> endDocument()


SAX의 경우 XML 문서를 순서대로 읽어 들여 처리 하는 구조이다.
문서를 앞 부분 부터 읽어 들이면 다양한 요소나 속성, 텍스트등이 등장 한다. SAX에서는 문서 안의 어떤 부분이 발견 되었을때 핸들러(Handler)라고 불리는 구조에 그 정보를 통지 하도록 되어 있다.  
따라서 프로그램 내부에 핸들러를 기술 함으로서 문서의 각 부분에 따라 처리하는 코드를 작성 하는것이 가능 하다.


car5.xml



승용차
150


트럭
500





SaxExam1.java
import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

class SaxExam1 {
public static void main(String[] args) throws Exception{
//SAX를 준비한다.
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();

//핸들러를 작성한다.
ExamHandler1 eh = new ExamHandler1();
//핸들러를 등록하여 문서를 읽어 들인다
sp.parse(new FileInputStream("car5.xml"), eh);
}
}
// 핸들러 클래스
// java.org.sax.helpers.DefaultHandler를 상속
class ExamHandler1 extends DefaultHandler{
//문서의 시작
public void startDocument() {

System.out.println("XML 문서가 시작 되었습니다...");
}
//문서의 종료
public void endDocument() {
System.out.println("XML 문서가 종료 되었습니다...");
}
}




핸들러 내에 정의해두면 호출되는 메소드

startDocument ? 문서의 시작 통지를 받음
endDocument ? 문서의 종료 통지를 받음
startElement(String namespaceURI, String localName, String qName, Attributes attrs ) ? 요소의 시작 통지를 받아 들인다.
endElement (String namespaceURI, String localName, String qName) ? 요소의 종료 통지를 받아 들인다.

charaters(char[] ch, int start, int length) ? 문자 데이터의 통지를 받아 들인다.
ignorableWhitespace(char[] ch, int start, int length) ? 요소내의 무시 가능한 공백 통지를 받아들인다.
processingInstruction(String target, String data) ? 처리 명령의 통지를 받아 들인다.


startPrefixMapping(String prefix, String uri) ? 접두사에 의한 네임스페이스 범위의 시작 통지를 받아 들인다.
endPrefixMapping(String prefix) ? 접두사에 의한 네임스페이스 범위의 종료 통지를 받아 들인다.






SaxExam2.java
//문서안의 요소가 등장시 요소명을 출력
import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

class SaxExam2 {
public static void main(String[] args) throws Exception{
//SAX를 준비한다.
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();

//핸들러를 작성한다.
ExamHandler2 eh = new ExamHandler2();


//문서를 읽어 들인다
sp.parse(new FileInputStream("car5.xml"), eh);
}
}

//------------------- 핸들러 클래스
class ExamHandler2 extends DefaultHandler{
//문서의 시작
public void startDocument() {
System.out.println("XML 문서가 시작 되었습니다...");
}
//문서의 종료
public void endDocument() {
System.out.println("XML 문서가 종료 되었습니다...");
}


//요소의 시작
public void startElement(String namespaceURI,  
         String localName,  
         String qName,  
         Attributes attrs) {
System.out.println(qName+"이(가) 시작됨...");
}
//요소의 종료
public void endElement(String namespaceURI,         String localName,         String qName) {
System.out.println(qName+"이(가) 종료됨...");
}
}




-------------------------------
SAX 예제 ? 텍스트의 처리
-------------------------------
핸들러 클래스에 아래 메소드를 추가

//문자데이터 추가, 텍스트 출현 시 호출
public void characters(char[] ch, int start, int length) {
String str = new String(ch, start, length);
if (str.trim().length() != 0){
System.out.println(str);
}
}




---------------------------------
SAX 예제 ? 요소의 추출
---------------------------------
SaxExam4.java(1) ? car 요소안의 name 요소전체를 추출
import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
class SaxExam4 {
public static void main(String[] args) throws Exception{
//SAX를 준비한다.
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();

//핸들러를 작성한다.
ExamHandler4 eh = new ExamHandler4();

//문서를 읽어 들인다
sp.parse(new FileInputStream("car5.xml"), eh);
System.out.println("요소 추출 완료~");
}
}
//------------------- 핸들러 클래스
class ExamHandler4 extends DefaultHandler{
StringBuffer sb = new StringBuffer();
boolean isPrint = false;
//문서의 시작시 호출
public void startDocument() {
sb.append("");
sb.append("");
}

//문서의 종료 시 호출
public void endDocument() {
sb.append("
");
//스트링 버퍼의 내용을 파일에 쓴다.
try {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("result4.xml")));
pw.println(sb);
pw.close();
}
catch (Exception e) { }
}

//요소의 시작시 호출
public void startElement(String namespaceURI,  
                               String localName,            String qName,            Attributes attrs) {
if (qName.equals("name")){
sb.append("<" + qName + ">");
isPrint = true;
}
}
//요소의 종료시 호출
public void endElement(String namespaceURI,       String localName,  
                           String qName) {

if (qName.equals("name")){
sb.append("isPrint = false;
}
}
//문자데이터 추가, 텍스트 출현시 호출, name요소의 텍스만 추출하기 위해 isPrint 변수를 둠…
public void characters(char[] ch, int start, int length) {
String str = new String(ch, start, length);
if (str.trim().length() != 0 && isPrint == true){
sb.append(str);
}
}
}




실행 결과 ? result4.xml



승용차
트럭




----------------------------------------
SAX 예제 ? 속성의 추출
-----------------------------------------
car6.xml ? car의 속성을 추출하여 새로운 결과 XML 요소로…




승용차
150


트럭
500





SaxExam5.java
import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
class SaxExam5 {
public static void main(String[] args) throws Exception{
//SAX를 준비한다.
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();

//핸들러를 작성한다.
ExamHandler5 eh = new ExamHandler5();

//문서를 읽어 들인다
sp.parse(new FileInputStream("car6.xml"), eh);
System.out.println("속성 추출 완료~");
}
}
//------------------- 핸들러 클래스
class ExamHandler5 extends DefaultHandler{
StringBuffer sb = new StringBuffer();
//문서의 시작시 호출
public void startDocument() {
sb.append("");
sb.append("");
}

//문서의 종료시 호출
public void endDocument() {
sb.append("
");
//스트링 버퍼의 내용을 파일에 쓴다.
try {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("result5.xml")));
pw.println(sb);
pw.close();
}
catch (Exception e) { }
}

//요소의 시작시 호출
public void startElement(String namespaceURI,       String localName,  
     String qName,  
     Attributes attrs) {
//car라는 요소 발견시 속성이 있다면 있는 동안 반복적으로속성을 요소로 변환하여 읽어 낸다.
  if (qName.equals("car")){
    for(int i=0; isb.append("<" + attrs.getQName(i) + ">");  //속성이름
sb.append(attrs.getValue(i));                       //속성값
sb.append("    }
  }
} }


실행결과 ? result5.xml



한국
미국




-------------------------------------
SAX 예제 ? 태그의 변환
-------------------------------------
car6.xml ? car의 요소를 한글 요소명으로 변환




승용차
150


트럭
500




SaxExam6.java
import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

class SaxExam6 {
public static void main(String[] args) throws Exception{
//SAX를 준비한다.
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();

//핸들러를 작성한다.
ExamHandler6 eh = new ExamHandler6();


//문서를 읽어 들인다
sp.parse(new FileInputStream("car6.xml"), eh);
System.out.println(" 요소 변환 완료~");
}
}
//------------------- 핸들러 클래스
class ExamHandler6 extends DefaultHandler{
StringBuffer sb = new StringBuffer();

//문서의 시작시 호출
public void startDocument() {
sb.append("");
}


//문서의 종료시 호출
public void endDocument() {
//스트링 버퍼의 내용을 파일에 쓴다.
try {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("result6.xml")));
pw.println(sb);
pw.close();
}
catch (Exception e) { }
}
//요소의 시작시 호출
public void startElement(String namespaceURI,String localName, String qName,  Attributes attrs) {


//요소명을 변환 한다.
if (qName.equals("cars")){
sb.append("<차리스트>");
}
if (qName.equals("car")){
sb.append("<차>");
}
if (qName.equals("name")){
sb.append("<상품명>");
}
if (qName.equals("price")){
sb.append("<가격>");
}
}


//요소의 종료
public void endElement(String namespaceURI,  String localName,   String qName) {
//변환된 종료 태그를 만든다.
if (qName.equals("cars")){
sb.append("");
}
if (qName.equals("car")){
sb.append("");
}
if (qName.equals("name")){sb.append(""); }
if (qName.equals("price")){sb.append("");}
}


//문자데이터 추가, 텍스트 출현시 호출
public void characters(char[] ch, int start, int length) {
String str = new String(ch, start, length);
if (str.trim().length() != 0){
sb.append(str);
}
}
}


실행결과 ? result6.xml


<차리스트>
<차>
<상품명>승용차
<가격>150

<차>
<상품명>트럭
<가격>500
출처 julymorning4님의 블로그 | 오라클러
원본 http://blog.naver.com/julymorning4/100019597082
Posted by 용식
TAG SAX, XML