2012-04-26 2 views
0

거대한 XML이 있습니다. 그 파일을 구문 분석하고 모든 <elem/>을 하나의 문자열로 가져와 데이터베이스에 저장해야하지만 파일 크기가 (~ 500MB)이므로 메모리 사용 공간이 적은의 메서드를 사용하면됩니다. 그렇게하는 방법 ? 그렇게하는 유용한 예제를 찾고 있습니다. 예 아래 내되지 매우 좋은 해결책 : 분할 후XML을 분할하는 방법은 무엇입니까? 예를 들면?

<?xml version="1.0" encoding="UTF-8"?> 
<doc> 
    <header>...<header> 
    <elem> 
    <a/><b/><c>...</c> 
    </elem> 
    <elem> 
    <a>...</a><b/><c>...</c> 
    </elem> 
    <elem> 
    <a>...</a> 
    </elem> 
    ... 
</doc> 

:

이제
{'<elem/>', '<elem/>', ...} 

내가 아래와 같이 SAX DefaultHandler를 사용해,하지만 난이 좋은 해결책이 아니라고 생각 :

class DataFileParser extends DefaultHandler { 

     StringBuffer sb; 
     boolean sElem = false; // is elem 

     ... 

     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
       if(sElem) { 
        sb.append("<"+qName+">"); 
       } 
       if (qName.equalsIgnoreCase("elem")) { 
        sb = new StringBuffer(); 
        sb.append("<"+qName+">"); 
        sElem = true; 
       } 
       ... 
     }    

     public void endElement(String uri, String localName, String qName) throws SAXException { 
       if (qName.equalsIgnoreCase("elem")) { 
        sElem = false; 
        sb.append("</"+qName+">"); 
       } 
       ... 
     } 

     public void characters(char ch[], int start, int length) throws SAXException { 
       if(sElem) { 
        sb.append(new String(ch, start, length)); 
       } 
     } 


... 
} 

답변

1

SAX 파서를 사용하는 것은 사실 좋은 해결책입니다. endElement에 데이터베이스에 직접 작성하는 것이 좋습니다. 그러나 한 번에 (예 : 단일 CLOB에서) 모든 것을 작성해야하는 경우 사용하는 파서에 관계없이 어딘가에 저장해야합니다. 당신은 임시 파일을 넣을 수 있습니다.

어떤 경우 든 SAX 구문 분석기는 가장 효율적인 솔루션입니다. 메모리 발자국은 파서 구현이 아닌 사용자가 처리하는 데이터의 양에 주로 의존하기 때문입니다.

+0

: 색슨-EE와 예를 들어 다음과 같은 스트리밍 변환은 트릭을 할 것입니다. 이제는 그것을 조각들로 구성해야합니다. – marioosh

1

낮은 수준의 Java 코드를 작성하지 않으려면 다른 해결책이 있습니다. 나는 한 번에 전체` `콘텐츠를 할 수있는 솔루션에 대해 생각했다

<xsl:stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" 
    xmlns:saxon="http://saxon.sf.net/" 
    version="3.0"> 

<xsl:template name="main"> 
    <xsl:for-each select="saxon:stream(doc('big.xml'))/*/elem"> 
    <xsl:result-document href="out{position()}.xml"> 
     <xsl:copy-of select="."/> 
    </xsl:result-document> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
관련 문제