2012-04-26 14 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> 
関連する問題