2012-01-19 2 views
0

私はフォーマット変換のためにxmlライターで作業しています。私は、StAX API(正確にはカーソルAPI)を使用することを決めました。なぜなら、ストリーミング機能のためです(入力ファイルはかなり大きく、セグメントごとに書き込む必要があります)。私は、入力ファイルから解析された値を格納するためにデータ形式(いくつかのクラス)を使用しています。私はまた、writeNodeメソッドを持つxmlファイルの記述のためのいくつかのクラスを作成しました。このメソッドは、次のようになります。JavaでStaxを使用しているときに空のxmlノードに関する問題

public void writeNode(Object object){ 
writer.writeStartElement(); 
... some writeNode calls of the children nodes 
writer.writeEndElement(); 

} 

名「ライター」を持つオブジェクトがStAXStreamWriterクラスのインスタンスです。 私の問題は、時にはこれらの子ノードが空であることです。これらの場合、親ノードはまったく書き込まれるべきではありません。現在のノードの開始タグはすでに記述されているため、現在は空のノードを生成しています。私が知っている限り、これは元に戻すことはできません。 この問題を解決するための任意のアイデアですか?

よろしく

ラース

更新:

私が思うに、私は解決策を見つけました。 XMLStreamWriterインターフェイスを実装する独自のクラスを作成します。このクラスでは、最初の属性またはノード値が書き込まれるまで、開始タグを格納するためにキューまたはリストデータ構造を使用します。

更新2:

ここで私の解決策をより正確に説明します。私は標準的なストリームライタークラスの周りに新しいクラスをラップするためにデコレータデザインパターンを使用しました。このクラスにはArrayListがあり、WriteCharacterメソッドが呼び出されるまで開始タグが格納されます。

答えて

1

XMLファイルを使用すると、現在のイベントをxmlStreamReader.getEventType()で取得できます。 XMLStreamConstants.START_ELEMENTに遭遇したときに、例えば、挿入順序を保持するコレクション(例えば、LinkedHashSet)に、開始タグ名を保持することができます。あなたがXMLStreamConstants.CHARACTERSが発生したとき

は、.getText()を行うと、xmlStreamWriterに以前に格納されたタグを記述しますが、このテキストが空でない場合にのみ、(多分あなたも.getText() -resultを.trim()たい)。

よろしくお願いします。 最大