2012-03-07 26 views
2

ソースXMLファイルから複数のXMLノードをターゲットファイルにコピーしたいとします。ソースファイルとターゲットファイルの両方が非常に大きいので、StAXを使用します。次のように一般的に私はプロセスにしようとしているファイルが見えます:StAXResultでTransformerを呼び出すときにXML宣言を省略する

<root> 
    <header> 
    <title>A List of persons</title> 
    </header> 
    <person> 
    <name>Joe</name> 
    <surname>Bloggs</surname> 
    </person> 
    <person> 
    <name>John</name> 
    <surname>Doe</surname> 
    </person> 
    . 
    . 
    etc... 
</root> 

対象ファイルは、次の形式である必要があります。

各ファイルが ヘッダノード、正確に一つが含まれている必要があり
<root> 
    <header> 
    <title>A List of persons</title> 
    </header> 
    <person> 
    <name>Joe</name> 
    <surname>Bloggs</surname> 
    </person> 
</root> 

ノードはすべてルートノード内に囲まれています。ソースファイルからのTransformerインスタンスコピー断片に配線されているどちらも、私はにXMLStreamReaderを介してソースファイルを読み込むしようとしている、とてXMLStreamWriterを使用して、それを書く:

は今、私の問題は次のとおりです。ターゲットファイルに追加します。次のように変圧器が作成されます

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(); 
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 

StAXSource stAXSource = new StAXSource(reader); 
StAXResult stAXResult = new StAXResult(writer); 

Iはまた、XML入力ストリーム内の所望の断片にカーソルを移動させるカスタムメイドの方法があります。最後に、私は終わるようにするため

// Moves XMLStreamReader cursor to the next fragment. 
moveCursorToNextFragment(XMLStreamReader reader, String fragmentNodeName) 

// Open file as usual... 

// Advance cursor to <header> node, and copy fragment till 
// </header> to the output writer. 
moveCursorToNextFragment(reader, "header"); 
transformer.transform(stAXSource, stAXResult); 

// Advance cursor to <person> node, and copy fragment till 
// </person> to the output writer. 
moveCursorToNextFragment(reader, "person"); 
transformer.transform(stAXSource, stAXResult); 

問題が生じたXMLファイルは、2つのXML宣言セクション、

の各呼び出しのための1つを含むことである。以下で
transformer.transform(stAXSource, stAXResult); 
次のように私は、出力を変換するために するStreamResultを使用してみましたが

transformer.transform(stAXSource, new StreamResult(myStream)); 

とXML宣言は省略されているが、私はStAXResultを使用してに戻って戻ったときに、XML宣言があります再び。私は、OutputKeys.OMIT_XML_DECLARATIONがオンかオフかにかかわらず(OutputKeys.STANDALONEの値が "yes"のような他の設定と同じように)効果がないことにも気付きました。

要するに、StAXResultを宛先として使用すると、Transformerでグローバルに設定されたこれらの設定は無視されているようです。

質問:Transformerは、Transformer.transform()の各呼び出し時にTransformerがXML宣言を発行しないように(XML宣言なしでフラグメントを書き込むなど)、これを実現する方法はありますか?

ご協力いただきありがとうございます。

答えて

0

ザランズSAX2StAXStreamWriterはこれを行います。別のXSLT実装では、動作が異なる場合があります。これを回避するには、あなたの作家をラップして、何もしないようにしてください。

writer = new StreamWriterDelegate(writer) { 
    @Override public void writeStartDocument() {} 
    @Override public void writeStartDocument(String version) {} 
    @Override public void writeStartDocument(String encoding, String version) {} 
}; 

はトリックを行う必要があります:StAXONライブラリが短い必要なコードを維持するのに役立ちますStreamWriterDelegateユーティリティクラスを提供します。

関連する問題