私は StAX ベースのパーサーの 1 つを好みます。Woodstoxパーサーは特にパフォーマンスが優れています。次に、別のタイプの XML パーサーを使用する必要がある場合は、イベントをパーサーからジェネレーターにシャントし、その XML を DOM ベースのパーサーや SAX ベースのパーサーなどにフィードできます (マゾヒストの場合... SAX は使用するパーサーの苦痛)。
次のような疑似コードが作成されます。
BufferedReader br = ...
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
Pattern startOfXml = Pattern.compile("<\\?xml.*\\?>");
String line;
while (null != (line = br.readLine()) {
if (startOfXml.matcher(line).matches()) {
XMLEventReader xr = inputFactory.createXMLEventFactory(br);
XMLEvent event;
while (!(event = xr.nextEvent()).isEndDocument()) {
// do whatever you want with the event
}
} else {
// do whatever you want with the plain-text
}
}
特定のモードの一部の StAX パーサーは isEndDocument() に反対する場合があり、その場合、ドキュメントを解析するイベント レベルをカウントし、ルート レベルの終了要素に到達するとブレークアウトする必要があります。また、一部のパーサーは、ドキュメントの末尾の後に数文字をキャッシュする場合があります...最悪の場合、パーサーが最後の要素の後のテキストに気付いたときに、「不正な形式の」ドキュメントの例外をキャッチする必要があります