2012-02-22 17 views
4

Javaを使用してAndroid上のSax XMLパーサーに関する質問:Webから取得したXMLファイルを解析する必要があります。いくつかはエラーを含んでおり、パーサーは「不一致のタグ」や「整形式でない(無効なトークン)」のようなエラーで中断します。Sax(Android上)で障害のあるXMLを解析する際のXMLエラーを無視する方法

これらのエラーは私にとっては問題ではありません。私はそれらを無視して続行したい、壊れたXML構造を処理できます。しかし、私はXMLファイルを修正することはできません、彼らは私のものではありません。例外をスローせずに続けるように、Android(クラスorg.xml.sax.XMLReader)でSaxに指示するにはどうすればよいですか? ErrorHandlerをアタッチしても機能しませんでした。例外が発生した場所での解析を再開できないため、例外をキャッチすることは役に立ちません。

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

  • ブラウザ "<BR>" の代わりにタグが閉じられることはありませんにもかかわらず、 "< BR/>" の罰金です。
  • "<B> <私>テキスト</B > </I >" 終了タグが間違った順序になっているにもかかわらず動作します。
  • 「&はを終了オッズは」無効なトークンにもかかわらず、「オッズ&アンプを、が終了し、」受け入れられている正しいだろう。

私は自分自身のパーサーを書いておらず、文字セットの変換とそのすべてを扱っています。 XMLを検証する必要はありません。ここに私のコードは、本質的に縮小された:

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

ありがとう!

答えて

2

いいえ、それはできないようです。 Saxはエラー検出をサポートしていますが、エラー回復はサポートしていません。このため、この例では堅牢なコードには理想的ではありません。 SaxにXmlPullParserをreplaxingすることで、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) {} 
関連する問題