0

以前は問題なく動作していたアプリケーションに SAXparser を実装しましたが、新しい XML ドキュメントで問題が発生しています。

これは私のパーサーです

public List<Article> getLatestArticles(String feedUrl) {
URL url = null;
    try {

        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();

        url = new URL(feedUrl);

        xr.setContentHandler(this);
        xr.parse(new InputSource(url.openStream()));


    } catch (IOException e) {
        Log.e("RSS Handler IO", e.getMessage() + " >> " + e.toString());
    } catch (SAXException e) {
        Log.e("RSS Handler SAX", e.toString());
    } catch (ParserConfigurationException e) {
        Log.e("RSS Handler Parser Config", e.toString());
    }
    catch (java.lang.IllegalArgumentException e){
        Log.e("RSS Handler lang", e.getMessage() + " >> " + e.toString());
    }

    return articleList;
}

パーサーは問題なく起動しますが、java.lang.IllegalArgumentExceptionエラーが発生します。これは、xml フィードに値のない要素が原因である可能性があると思います。次のようになります<Description/>

これを修正する方法についての提案は大歓迎です。

4

3 に答える 3

1

が自己終了タグの場合</Description>(つまり、開始<Description>タグがなく、テキスト値がない場合)、この構文は完全に正しいです。

コールバック メソッド (例: startElement メソッド) を確認せずにエラーの原因を正確に特定することは困難ですが、確認できる重要な問題が 1 つあります。

illegalArguementExceptionInputStream が nullの場合、SAX parse メソッドは をスローします。SAX パーサーに渡される値を確認する価値があるかもしれません。

次のコードを使用して、入力ストリームの null をチェックできます。

InputStreamReader reader = new InputStreamReader(url.openStream());

if (!reader.ready()) {
    System.out.println("error");
}
于 2012-09-14T14:26:54.977 に答える
0

<Description/>SAXParser の xml 構築の問題です。構造を見てください。

理想的には</Description>、終了タグとして使用する必要があります。

自己終了タグの場合、SAXParser はそれを終了タグと見なします。

そのため、代わりにstartElementから電話がかかってきendElementます。

于 2012-09-14T11:10:45.087 に答える
0

すべてのデータがダウンロードされる前に、接続が終了する可能性があります。BufferedInputStream を使用してみて、それが役立つかどうかを確認してください。

BufferedInputStream _url_ = new BufferedInputStream(new URL(feedUrl).openStream());

...

BufferedReader isr = new BufferedReader(new InputStreamReader(_url_));
InputSource is = new InputSource(isr);
xr.parse(is);
于 2012-09-15T07:34:22.080 に答える