2015年5月18日月曜日

XMLStreamReader が持つXML をファイル出力する場合

[ 解決課題 ]
XML に問題があり、ファイル退避、かつ、問題箇所以降のXML を読み込みたい。

[ 検討結果 ]
ファイル退避、もしくはXML の読み込みのどちらかを選択する必要がある。 両方実施したい場合は、自前パーサーを作成する必要がある。

[ 処理内容 ]
前提として、reader は元から存在するものとし、XML 情報を持つとする。
 StringWriter sw と、XMLStreamWriter writer を準備して、Transformer class を利用して、 transform method をCall するとsw にXML 情報が入力される。
これをtoString() してあげれば、XML の出力が可能。

 しかし、問題点があり、transform() をCall すると、XMLStreamReader reader の情報がすべて失われてしまう。
そのため、XML のある1箇所に問題があり、すべてのXML を出力、かつ、問題の箇所以降のXML を再読み込みすることができない。
 DeepCopy もできないため(*1)、2回XML の読み込みをしたい場合は、StringWriter にすべて書きだした後に、 自前のパーサーを作って処理を実行しないといけない。

*1) http://stackoverflow.com/questions/9837861/how-to-remember-xmlstreamreader-position-in-xml-with-stax

public void parse(XMLStreamReader reader){
 StringWriter sw = new StringWriter();
 StAXSource source = new StAXSource( reader );
 XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newFactory();
 XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
 XMLStreamWriter writer;
 String rawxml = null;
 try {
     XMLStreamReader re = xmlInputFactory.( reader );
     writer = xmlOutputFactory.createXMLStreamWriter( sw );
     TransformerFactory tf = TransformerFactory.newInstance();
     Transformer t = tf.newTransformer();
     StAXResult result = new StAXResult( writer );
     t.transform( source, result );
     rawxml = sw.toString();
    } catch ( XMLStreamException e ) {
     e.printStackTrace();
    } catch ( TransformerConfigurationException e ) {
     e.printStackTrace();
    } catch ( TransformerException e ) {
     e.printStackTrace();
    }
} 

0 件のコメント:

コメントを投稿