xml을 스트리밍 타입으로 읽어야 되는 필요성은 xml파일의 크기가 큰 경우에 해당하는것으로
이경우 xml 구조를 원하는데로 한꺼번에 가져오면 outOfMemory가 발생해서
VM이 죽어버리게 된다.
해법은 XML을 순차적으로 읽는것인데 JAVA에서는 특별한 API를 이용하지 않고서도
JDK6.0이상에서 지원되는 기본 API만으로도 쉽게 해결 할 수 있다.
: 찾아보면 아래와 같은 방법을 SAX와 DOM의 장점을 섞어 놓은 방법이라고 한다. test해본 결과
의도한데로의 결과가 잘 출력이 되어서 다행이였다.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;public class Read2StreamingTypeXML {
private XMLInputFactory inputFactory = null;
private XMLStreamReader xmlReader = null;
public Read2StreamingTypeXML() {
inputFactory = XMLInputFactory.newInstance();
}
public void read() throws Exception{
xmlReader = inputFactory.createXMLStreamReader(
new FileReader("neouserCreate.xml"));
while (xmlReader.hasNext()){
Integer eventType = xmlReader.next();
if (eventType.equals(XMLEvent.START_ELEMENT)){
System.out.print(" " + xmlReader.getName() + " ");
}else if (eventType.equals(XMLEvent.CHARACTERS)){
System.out.print(" " + xmlReader.getText() + " ");
}else if (eventType.equals(XMLEvent.ATTRIBUTE)){
System.out.print(" " + xmlReader.getName() + " ");
}else if (eventType.equals(XMLEvent.END_ELEMENT)){
System.out.print(" " + xmlReader.getName() + " ");
}
}
xmlReader.close();
}
public static void main(String args[]){
try{
Read2StreamingTypeXML obj = new Read2StreamingTypeXML();
obj.read();
}catch(Exception exception){
exception.printStackTrace();
}
}
}
추가적으로 stream 방법으로xml을 읽는경우에는 start와 end를 적절히 사용해서
stringBuffer에 적재하고 분석하는 로직이 추가로 개발 되어야 한다. 위에 코드는 단순히 streaming 형태로 xml을 읽을 수 있다는 sample만을 제시하고 있다.