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 件のコメント:
コメントを投稿