본문 바로가기
코드

Java API for XML

by ehei 2006. 5. 9.

http://www.perfectxml.com/JAXP.asp

 

이 글은 위 링크의 문서를 기초하여 작성되었다. DOM 방식의 예제가 먼저 있으나, 오픈 API 기반은 SAXON 예제도 포함되어 있다. DOM은 문서 전체를 파싱하여 메모리에 로드하므로, 문서가 클 경우 SAX 형식으로 파싱해야 한다.

 

작성한 예제는 다음과 같다


1147154427_WebApplication2.zip

넷빈 5.0으로 작성했으며, 톰캣 5.0이면 돌릴 수 있다. 예제는 회원 가입 시 XML에 저장하고, 회원 여부는 동일한 XML을 검색하여 수행한다.

 

먼저 다음 라이브러리를 임포트해야 한다.

 

import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

 

파싱할 XML은 다음과 같다.

 

<data>

<member>
<id>ehei</id>
<pass>1</pass>
<mail>ehei1@hanmail.net</mail>
</member>
<member>
<id>beno</id>
<pass>1</pass>
<mail>benosunz@naver.com</mail>
</member>

</data>

 

파싱 작업은 아주 간단하다. 깊이에 따라 for 문이 중첩으로 쓰일 수 있다. 이는 충분히 함수로 대체될 수 있다.

 

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
 
 try {
     DocumentBuilder domBuilder = domFactory.newDocumentBuilder();
     Document doc = domBuilder.parse( "member.xml" ); // doc에 파싱 결과가 담긴다

 

     NodeList data = doc.getChildNodes(); // 모든 자식 노드를 얻어온다
     NodeList members = data.item(0).getChildNodes(); // data 태그 하위의 모든 노드를 얻어온다
     
     for( int i = 0; i < members.getLength(); ++ i ) {
         NodeList info = members.item(i).getChildNodes();
         System.out.println(m.getNodeName() + " " + m.getNodeValue() );

 

         for( int j = 0; j < info.getLength(); ++ j) {
              Node m = info.item(j);
      
              if(Node.ELEMENT_NODE == m.getNodeType()) { // 각 타입은 javaDoc 참조
                   System.out.println(j + " " + m.getNodeName() + " " + m.getTextContent());
         }
     }

     ...

 

 

데이터를 XML로 저장하기: Document를 만든 다음 변환 작업을 수행하면 된다. data.xml 파일에 data 태그 하위로 member를 자손으로 추가한다.

 

 try {
     DocumentBuilder domBuilder = domFactory.newDocumentBuilder();
     Document doc = domBuilder.parse( "member.xml" );
     
     Element idElem = doc.createElement("id"); // 지정된 태그 이름(여기서는 "id")를 가진 엘레멘트를 만든다
     Element passElem = doc.createElement("pass");
     Element mailElem = doc.createElement("mail");
     
     idElem.appendChild(doc.createTextNode(id)); // id를 idElem의 값으로 저장한다
     passElem.appendChild(doc.createTextNode(pass));
     mailElem.appendChild(doc.createTextNode(mail));
     
     Element memberElem = doc.createElement("member");
     memberElem.appendChild(idElem);
     memberElem.appendChild(passElem);
     memberElem.appendChild(mailElem);
     
     Node data = doc.getChildNodes().item(0);
     data.appendChild(memberElem);
     
     //  Save the document to the disk file
    TransformerFactory tranFactory = TransformerFactory.newInstance();
    Transformer aTransformer = tranFactory.newTransformer();
     
    Source src = new DOMSource(doc);
    Result dest = new StreamResult(new File(memberFile));
    aTransformer.transform(src, dest); // 변환하여 저장한다.

    ....


'코드' 카테고리의 다른 글

온라인 도서관리  (0) 2006.05.22
삼각형 그리기/이동/반전  (0) 2006.05.18
AJAX로 구현한 동적 웹사이트  (0) 2006.05.01
Cohen-Sutherland Algorithm for line clipping  (0) 2006.04.16
뷔퐁의 바늘  (0) 2006.03.29