2016-11-02 3 views
0

私はアプリケーションでXML文書をストリームするのにWoodstoxを使用しています。彼らが処理される前に、スキーマで定義された要素のデフォルト属性を設定する必要がありますが、Woodstoxでこれを行う唯一の方法は、既定の属性を書き込むいくつかのロジックを持つ余分なXMLStreamReaderを使って文書をメモリに読み込み、インメモリXML文書に変換し、インメモリ文書をビジネスロジックに渡します。Java:XMLStreamReader2で属性を設定しますか?

私はこれが好きではありません。私はドキュメントが潜在的に大きい可能性があり、私はアプリケーションでこれの複数のインスタンスを実行しているので、メモリフットプリントを低く保つために要素ごとにドキュメントをストリーミングしたいです。ドキュメントをストリーミングする際にXMLStreamReaderに属性を挿入する方法はありますか?

public class XMLPreProcessor extends StreamReader2Delegate { 
    public XMLPreProcessor(XMLStreamReader2 sr) { 
     super(sr); 
    } 

    //Skip over all processing instructions 
    //Can this be extended to inject attributes to elements? 
    @Override 
    public int next() throws XMLStreamException { 
     int eventType = super.next(); 

     while(eventType == XMLStreamConstants.PROCESSING_INSTRUCTION) { 
      eventType = super.next(); 
     } 

     return eventType; 
    } 
} 

はこのデリゲートは、XMLStreamReader内に属性を注入するために微調整することができます:私はすでに、私はしばらくのストリーミングには興味がないんだノードをスキップする方法を発見しましたか?

答えて

1

いいえコンテンツを挿入する機能はないと思います。イベントAPI(XMLEventReader)を使用していた場合は、おそらく要素オブジェクトを変更できます。

ただし、デリゲートを使用するアプローチが有効です。属性にアクセスするすべてのメソッドをオーバーライドし、追加の属性の状態を保持する必要があります。だから、どれくらいの属性があるのか​​尋ねられれば、オリジナルのカウントと注入された属性を返します。おそらく事実上オリジナルの後に新しいものを追加するでしょう。 これは実行可能です。 START_ELEMENTが読み込まれると常にnext()を上書きして状態を更新する必要があります。進んだ後は破棄してください。

+0

デリゲートをXMLEventReaderでラップしてしまい、 'nextEvent()'メソッドをオーバーライドして、要素のデフォルト属性を注入しました。 XMLStreamReaderをオーバーライドするにはメソッドが多すぎます。実装固有であるため、ニッチな機能ではあまりにも多くの作業が必要です。 XMLEventReaderをオーバーライドする方が簡単ですし、実装を変更すると書き直しが簡単になります。 – user1428945

関連する問題