5

Java を使用した Android の Sax XML パーサーに関する質問: Web から取得した XML ファイルを解析する必要がありますが、それを制御することはできません。一部にはエラーが含まれており、「タグの不一致」や「形式が正しくありません (無効なトークン)」などのエラーでパーサーが異常終了します。

これらのエラーは私には関係ありません。無視して続行したいと思います。破損した XML 構造を処理できます。しかし、XML ファイルを修正することはできません。それらは私のものではありません。Android 上の Sax (クラス org.xml.sax.XMLReader) に、例外をスローせずに続行するように指示するにはどうすればよいですか? ErrorHandler をアタッチしてもうまくいきませんでした。また、停止した場所から解析を再開できないため、例外をキャッチしても意味がありません。

私の XML は HTML ではありませんが、ブラウザがエラーを無視して続行する (X)HTML の例をいくつか示します。私もこれをやりたいです。

  • タグが閉じられていなくても、ブラウザーは" <br/> "の代わりに" <br> " で問題ありません。
  • " <b><i> text </b></i> " は、終了タグの順序が間違っていても機能します。
  • オッズ & エンド」は無効なトークンにもかかわらず受け入れられます。「オッズ & エンド」は正しいでしょう。

文字セットの変換などを処理する独自のパーサーを作成したくありません。XML を検証する必要はありません。これが私のコードです。

XMLReader r = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
r.setErrorHandler(new MyLenientErrorHandlerThatNeverThrows());
r.setContentHandler(new MyImporterThatExtendsDefaultHandler());
r.parse(new InputSource(new BufferedReader(...)));

ありがとう!

4

1 に答える 1

2

わかりました、それはできないようです。Sax はエラー検出をサポートしていますが、エラー回復はサポートしていないため、この例の堅牢なコードには理想的ではありません。Sax を XmlPullParser に置き換えることで動作するようになりました。これにより、次のトークンの呼び出しを try-catch ブロックでラップできます。

try {
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    XmlPullParser xpp = factory.newPullParser();
    xpp.setInput(in);
    int type = xpp.getEventType();
    while (type != XmlPullParser.END_DOCUMENT) {
        switch (type) {
          case XmlPullParser.START_TAG: startTag(xpp);             break;
          case XmlPullParser.END_TAG:   endTag(xpp);               break;
          case XmlPullParser.TEXT:      characters(xpp.getText()); break;
        }
        try {type = xpp.next();}
        catch (XmlPullParserException e) {}
    }
} catch (Exception e) {}
于 2012-03-02T12:07:57.087 に答える