2012-01-20 6 views
0

eventReaderを使用してStAXパーサーから文字を取得するコードがあります。コードは次のようになります。Java 6 CDATAを解析する際のeventReaderのStAXパーサのバグasCharacters

private String getNextCharacters(XMLEventReader eventReader) throws XMLStreamException { 
    StringBuilder characters = new StringBuilder(); 
    XMLEvent event = eventReader.nextEvent(); 

    String data = event.asCharacters().getData(); 
    characters.append(data); 

    while (eventReader.peek() != null && eventReader.peek().isCharacters()) { 
     event = eventReader.nextEvent(); 
     data = event.asCharacters().getData(); 
     characters.append(data); 
    } 

    return characters.toString(); 
} 

時折asCharactersが隣接isCharactersイベントの間で合体されていないため、whileループです。これはis_coalescingフラグが設定されているかどうかに依存しないようです。これは妥当な回避策のように思えましたが、二次的なバグを引き起こしたようです。時には私の文字列に]]>追加されることがあります。これは非常にまれであり、XMLの5000行で約1回ですが、一貫して発生します。デバッグ最初のイベントがCDATAの場合、2番目のisCharactersイベントで発生することがわかります。パーサーは、2番目のイベントによってCDATA命令のトラックを失うようです。

他にもこれを見ましたか?誰かが単にストリッピングするよりも良い回避策を持っていますか]]>私の文字列の終わりを離れて?私はオンラインやここで重要なものは見つけられませんでした。代わりに

data = event.asCharacters().getData(); 

答えて

0

あなたは

Characters characters = event.asCharacters(); 
data = characters.getData(); 

if(characters.isCData()) { 
/* handle CDATA */ 
} else if (characters.isWhiteSpace()) { 
/* handle whitespace*/ 
} else if (characters.isIgnorableWhiteSpace()) { 
/* handle ignorable whitespace*/ 
} 

HTH、 マックス

+0

感謝を行くことができます。それは多かれ少なかれ私が問題を解決するためにしたものです。私の本当の問題は、Java 6標準ライブラリをオーバーライドしていたクラスパスに非常に古いXMLライブラリがあることです。 –

+0

これはうまくいきました。乾杯 –

関連する問題