'XML & WebServices'에 해당되는 글 4건

  1. 2012.11.15 [XStream] XStream 사용예 (4)
  2. 2008.12.05 dom4j를 사용해 봅시다. - (1) XPath
  3. 2008.05.26 xml dtd
  4. 2008.05.26 SAX(Simple API for XML)

crescent에서 색인 설정 파일을 xml로 정의하고 있습니다.

collections.xml인데요... 본래 이걸 그냥 dom4j를 사용해서 읽어서 Map과 기타 필요한 오브젝트를 생성하는

형태로 만들어서 사용하고 있었습니다.


그러다보니.. webpage에서 이 collections.xml설정을 변경하는 기능을 추가하려보니..

저런 형태로는 다루기가 어려울 것 같아서 XML과 POJO의 변환에 관련된 라이브러리를 찾아보다가

XStream을 알게되어 처음 사용해보았습니다.


꽤 오래전부터 많이 사용되던 것 같은데..

왜 몰랐을까요 -_-;


http://xstream.codehaus.org


예제도 잘 나와있습니다.


이걸 사용해서 collections.xml을 변환해본 예제입니다. xml 자체가 그리 복잡하지 않아서..

특별히 어려운 내용은 없습니다.


XStream 사용하시는 분들께서 예제로 보시면 좋을 것 같아서 올려봅니다.


현재 사용되고 있는 xml인데요.. XStream을 사용하기 위해서 각 엘리먼트들을 전부 클래스로 만들었습니다.

여기서는 최상위 Root를 나타내는 CrescentCollections 와 그 하위인 CrescentCollection

그리고 CrescentCollection 하위로 들어가는 CrescentCollectionField, CrescentDefaultSearchField, CrescentSortField가 만들어졌습니다.


indexingDirectory와 analyzer 부분은 CrescentCollection의 field로 들어갑니다.



CrescentCollections.java

XStream의 annotation을 사용하였고요..

@XStreamAlias로 지정된 name 값이 엘리먼트명이 되고..

@XStreamOmitField로 지정된 field는 XML의 변환에서 제외됩니다.


@XStreamImplicit(itemFieldName="collection")
	private List crescentCollections = null;

이 부분은.. <collections></collections>가 하위에 <collection></collection>을 2개 가지고 있는데 그것을 나타내기 위한 설정입니다. 추후 실제 XML로 변환하는 코드에서 추가로 말씀을 드리겠습니다.


getter, setter 메서드는 코드에서는 생략했습니다.

CrescentCollection.java

<collection></collection>이 가지고 있는 항목들을 표한하기 위한 설정들이 들어가있습니다.

@XStreamAsAttribute 이 설정을 가지고 있는 field는 xml에서 속성으로 표현됩니다.

<collection name="sample"> 과 같은 형태로요...




CrescentCollectionField.java

<field></field>는 전부 속성으로 되어있기 때문에 특별한 설정은 없고.. 다만 위 xml예에서는 각 속성이 <field></field>로 조금씩 다른데.. 위와 같이 사용하기 위해서는 필드가 전부 동일해야 하겠죠... 




CrescentDefaultSearchField.java


<defaultSearchField/>나 <sortField/>는 거의 비슷하기 때문에 하나만...

이제 이 XML을 POJO로 변환하는 코드입니다.




Test

위와같이 해주시면 되는데...

processAnnotation은 최상위 클래스만 걸어주시면 됩니다.



Posted by 용식
TAG java, Xstream

http://stackoverflow.com/questions/1006283/xpath-select-first-element-with-a-specific-attribute 

이번에 플젝을 하면서 xml을 읽어서 처리 할 부분이 있었습니다.
jdom을 사용했었는데, dom4j라는 것을 알게 되어서 한번 사용을 해보려고 합니다.
일단 간단한 사용 방법을 익히기 위해서 이것저것 해보겠습니다.

dom4j는 xpath의 사용이 예전 jdom에 비해서 많이 편해졌습니다.

일단 xpath의 간단한 가이드를 먼저 알아보겠습니다.

1. "/AAA"
root Element를 선택합니다.

<AAA>
 <BBB><BBB/>
 <CCC><CCC/>
 <DDD>
    <BBB/>
  <DDD/>
</AAA>

2. "/AAA/CCC"
root element AAA의 자식element 중 CCC를 모두 선택합니다.

     <AAA>
          <BBB/>
          <CCC/>
          <BBB/>
          <BBB/>
          <DDD>
               <BBB/>
          </DDD>
          <CCC/>
     </AAA>

3. "/AAA/DDD/BBB"
    root Element AAA의 자식element인 DDD의 자식element인 BBB를 모두 선택합니다.
 
    <AAA>
          <BBB/>
          <CCC/>
          <BBB/>
          <BBB/>
          <DDD>
               <BBB/>
          </DDD>
          <CCC/>
     </AAA>

4."//BBB"

element BBB를 모두 선택합니다.
     <AAA>
          <BBB/>
          <CCC/>
          <BBB/>
          <DDD>
               <BBB/>
          </DDD>
          <CCC>
               <DDD>
                    <BBB/> 
                <BBB/>
               </DDD>
          </CCC>
     </AAA>

5."//DDD/BBB"
DDD의 자식element인 BBB를 모두 선택합니다.

    <AAA>
          <BBB/>
          <CCC/>
          <BBB/>
          <DDD>
               <BBB/>
          </DDD>
          <CCC>
               <DDD>
                    <BBB/>
                    <BBB/>
               </DDD>
          </CCC>
     </AAA>

더 자세한 내용은

http://www.zvon.org/xxl/XPathTutorial/Output/example1.html

이곳을 참조하세요.



Posted by 용식
TAG dom4j, Xpath

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