XML2009. 7. 8. 21:32

오늘은 SAX에 대해서 배웠다.
SAX란 XML의 내용을 지가 알아서 Parse해준다 그정도??
XML의 내용을 SAX에 정의된 규칙대로 나눠 준다.
HTML부터 오늘의 XML까지 완전 그로기 상태다.
자 그럼 SAX를 설명??해보겠다.


//BoardHandler는 DefaultHandler를 상속받게된다.
//구현되는 메소드에는 startElement, characters, endElement가 있다.
public class BoardHandler extends DefaultHandler {
 private final String BOARDS = "boards";
 private final String BOARD = "board";
 private final String TITLE = "title";
 private final String CONTENT = "content";
 private final String REGIST_DATE = "registDate";
 private final String READ_COUNT = "readCount"; //각각의 변수에 Element의 이름과 같은 값을 넣어준다.
 private String currentElement = "";   //현재의 Element를 담을 변수

 private List<Board> boardList = null;   //Board형으로 데이터를 담으면 그걸 차례대로 넣을 List
 private Board board = null;   //Board형으로 데이터를 가져와 담을 Board객체
//시작태그를 만나게 되면 실행되는 메소드.
//시작태그의 이름을 가져온다.
//시작태그의 이름에 맞는 행동들을 써준다.
//태그의 이름은 localName이나 qName으로 넘어온다.
public void startElement(String namespaceURI, String localName, String qName, Attributes atts)
 throws SAXException {
  if(BOARDS.equals(qName)){
   boardList = new ArrayList<Board>();
  }
  if(BOARD.equals(qName)){
   board = new Board();
  }
  currentElement = qName;
 }

//태그이외의 문자를 처리해주는 메소드
//실질적인 데이터를 추출해내는 부분이다.
//알아서 파싱한 문자열을 char형태로 받아 시작 인덱스와 길이만큼 파싱을해 String객체에 넣어준다
//각각의 조건에 맞게 Board안에 넣어준다.

public void characters(char[] ch, int start, int length)
 throws SAXException {
  String str = new String(ch, start, length);
  if(TITLE.equals(currentElement)){
   board.setTitle(str);
  }
  if(CONTENT.equals(currentElement)){
   board.setContent(str);
  }
  if(REGIST_DATE.equals(currentElement)){
   board.setRegistDate(str);
  }
  if(READ_COUNT.equals(currentElement)){
   board.setReadCount(str);
  }
 }

//종료 태그를 만나게 되면 실행되는 메소드
//종료태그를 만날때마다 차곡차고넣어둔다...List에..
//언제까지?? 종료태그의 끝까지...
//그후 XML에서 뽑아온 데이터를 출력해주는 부분까지.
public void endElement(String namespaceURI, String localName, String qName)
 throws SAXException {
  if(BOARD.equals(qName)){
   boardList.add(board);
  }
  
  for(int i = 0;i < boardList.size();i++){
   Board board = boardList.get(i);
   System.out.println(board.getTitle());
   System.out.println(board.getContent());
   System.out.println(board.getRegistDate());
   System.out.println(board.getReadCount());
  }
 }
}

수업시간 내내.. 그리고 저녁먹고나서까지 이해가 안됐던 SAX..

뭐든 쉽게 쉽게 생각하자...어려운거란 없다...

어렵다 생각하면 끝까지 어려운거고 쉽다고 생각하면 쉬운거다.

쉽다...쉽다...쉽다...쉽다...쩝...그게말처럼 되지않는게 현실...-_-;;ㅋ

'XML' 카테고리의 다른 글

XML and DTD...!  (0) 2009.07.07
Posted by Z700zZz
XML2009. 7. 7. 20:57
-DTD파일의 내용
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT members (member+)>
<!ELEMENT member (userId, userPw, userName, sex, hobbys, location)>
<!ELEMENT userId (#PCDATA)>
<!ELEMENT userPw (#PCDATA)>
<!ELEMENT userName (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT hobbys (#PCDATA)>
<!ELEMENT location (#PCDATA)>



- XML파일의 내용
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE members SYSTEM "member.dtd">
<members>
    <member>
        <userId>dd</userId>
        <userPw>dd</userPw>
        <userName>dd</userName>
        <sex>dd</sex>
        <hobbys>dd</hobbys>
        <location>dd</location>
    </member>
</members>

-XML파일의 타입을 정해주는게 DTD파일이 하는일이다.
오라클을 예로 들자면 Members는 데이터 베이스의 이름이 될것이고, Member는 테이블의 이름, 그리고 나머지 userId, userPw가 컬럼명이 될것이다.
DTD파일의 내용은 위의 예제와 같다.
우선은 첫번째 줄엔 XML의 버전과 인코딩 타입이 들어가고..
두번째 줄엔 Element들이 들어가게 된다.
Element의 이름뒤엔 각각 들어갈 수 있는 타입이 들어간다.
members뒤에 +는 몇개의 Element가 오느냐에 따라 달라진다.
그리고 member뒤에는 Oracle에서의 Column의 이름들이 오게된다.
XML파일은 DTD파일에서 명시한 규칙대로 데이터를 작성해주면 된다.
<!DOCTYPE members SYSTEM "member.dtd">
이렇게 규칙이 적힌 DTD파일을 걸어주게 되면 규칙에 어긋나는 문법이 있을경우 이클립스에선 알아서 빨간줄을 그어준다.
예제에서 볼수 있듯이 DTD의 규칙대로 XML파일이 작성되어 있는것을 볼수있다.
DTD파일은 쉽게말해 Java의 Interface같은 존재??

'XML' 카테고리의 다른 글

SAX...!  (0) 2009.07.08
Posted by Z700zZz