2011-09-13 17 views
5

バッチで大量のデータを処理する非常に大きなXMLファイル(700mb +)を作成しています。このプログラムは、非常に大きなサイベースデータベースとアプリケーションの間のインタフェースとして機能します。私は現在、クラスにバインドされたxsdスキーマを持っています。私は再起動ロジックを念頭に置いてXMLを書くことができる方法が必要です。Java JAXB - 再起動ロジックを使用したXMLファイルの作成

I.E.私がどこを離れたかを知ることができます。言い換えれば、プログラムが失敗した場合、XMLファイルに最後に書き込まれた内容を確認して、中止した箇所を見つけ出す必要があります。ここに例があります。

<root> 
    <WorkSet> 
    <Work> 
     <Customer> 
    <Work> 
     <Customer> 
    <WorkSet> 
    <Work> 
     ..... 
<root> 

書き込み 'work'ノードまたは 'workset'ノードを書き込んだ後にプログラムが失敗するとします。私が処理を中止した場所を拾う方法はありますか? XMLファイルのせん断サイズのためにXMLファイルをメモリに読み戻さないようにしようとしています(500MBのXMLを終了して失敗するとします)。

ありがとうございました。

答えて

3

あなたはJAXBのフラグメントモード(JAXBは、ヘッダを書き込まないとき)に一つずつそれらを書くことができる独立したワークセットの要素にデータを分割することができれば。後で単純にファイルを連結し、欠落しているXML宣言を追加して、終了終了タグを開きます。

それはだが、あなたがこのためにあなたの生成されたクラスを変更する必要があることも可能です。私は@XmlRootElementをWorkSet Javaクラスに追加することを意味します。 1つのステップのために1つのWorkSetがまだ大きければ、Workでもこれを行うことができますが、欠落しているタグを何らかの形で生成する必要があります。

+0

+1 - 私はこれらの行に沿って何かを提案しようとしていました。 –

+0

WorkSet Javaクラスに@XmlRootElementタグを追加すると、複数のWorkSetを連結した後の1つの大きなXMLファイルの機能に影響しますか?私は幾分新しくJAXBですので、正しく理解していない場合はお知らせください。 – TyC

+1

'@XmlRootElement'を追加しても元の機能には影響しないと思います。追加することなく、 '@ XmlRootElement'' Marshaller.marshal() '次の例外スロー:' com.sun.istack.SAXException2:それが欠落しているため、要素としてタイプ「org.package.MyWorkSet」をマーシャリングすることができないが@ XmlRootElement注釈」となります。 – palacsint

2

私はあなたが整列化されているかどうかのオブジェクトを追跡し、カスタムマーシャラーの実装を作成して書き出すフラグメントモードを使用することができ

JAXBはこの仕事のために適切なツールであると思いますが、...しないでください個々のオブジェクト。

+0

+1 JAXBは正しいツールのようには聞こえません。 SAXパーサーを使用するだけで、ファイル内のどこにいるのかを自分で追跡できます。例えばStAXを見てみましょう... http://stax.codehaus.org/Home – Brad

関連する問題