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 |