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만을 제시하고 있다.




글 보관함

카운터

Total : / Today : / Yesterday :
get rsstistory!