"간단한 구조이지만 분량이 많은 XML형태의 파일(or String)을 파싱하여 읽어와서 자동으로 DB에 저장해야 할 일이 생겼다."
이말을 들으면 XML파서의 양대산맥(?)인 DOM과 SAX의 장단점을 조금이라도 아는 개발자라면
"당연히 SAX를 써야겠네!" 할것이다.
물론 나도 그렇게 생각했다.
Parent-Child구조가 단순하고 검색이나 추가,수정등의 작업이 적은 파싱에는 SAX가 유리하다기에..
그러나..버뜨..
SAX를 이용한 파싱프로그램을 해본적 없는 내가 검색해본 SAX샘플들은 나를 당황스럽게 만들었다.
객체구조를 가진 DOM과 달리 이벤트 핸들링및 순차적인 실행구조 등
자바식 웹프로그래밍에 익숙한 사람에게는 직관적인 이해가 녹록하진 않았다.ㅜ.ㅜ
그렇다고 수만건이 넘는 XML을 내가 익숙하다고 DOM으로 만들수는 없는일..
고민끝에 우연히 찾은 jdom...
가뭄끝의 단비였다. 이름의 J(ava)DOM이 의미하듯 자바 개발자들이 DOM이나 SAX의 장점을
직관적으로 이용하기에 괜찮다는 생각이 든다.
(나의 경우에는 jdom에서 SAXBuilder를 불러와 DOM의 객체다루듯이 사용할수 있었다.)
========================================================================
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
import org.jdom.Element;
import org.jdom.Document;
import org.jdom.output.XMLOutputter;
import org.jdom.adapters.*;
...
...
public void getMigrationDetail(BUObjectCache listCache) throws IOException, JDOMException {
for(int i=0;i<listCache.size();i++){
BUMapObject item = (BUMapObject)listCache.elementAt(i);
String xmldoc = (String)item.get("content");
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new StringReader(xmldoc));
Element root = doc.getRootElement();
List children = root.getChildren();
Iterator iter = children.iterator();
while( iter.hasNext() ) {
Element detail = (Element)iter.next();
logger.debug("detail.getName():::"+ detail.getName());
logger.debug("detail.getValue():::"+ detail.getValue());
}
}
}