0

Web の XML を使用する RSS リーダーを作成しようとしています。何らかの理由で、最後の要素のみを読み取ります。

これはほとんどの XML ファイルです。

<rss version="2.0">
    <channel>
        <item>
            <mainTitle>...</mainTitle>
            <headline>
                <title>...</title>
                <description>...</description>
                <subTitle>...</subTitle>
                <link>...</link>
            </headline>

            <headline>
                <title>...</title>
                <description>...</description>
                <subTitle>...</subTitle>
                <link>...</link>
            </headline>
        </item>

        <item>
            <mainTitle>...</mainTitle>
            <headline>
                <title>...</title>
                <description>...</description>
                <subTitle>...</subTitle>
                <link>...</link>
            </headline>

            <headline>
                <title>...</title>
                <description>...</description>
                <subTitle>...</subTitle>
                <link>...</link>
            </headline>
        </item>
    </channel>
</rss>

これはパーサーです:

public class RssHandler extends DefaultHandler {

    // Feed and Article objects to use for temporary storage
    private Article currentArticle = new Article();
    private List<Article> articleList = new ArrayList<Article>();

    // Number of articles added so far
    private int articlesAdded = 0;

    // Number of articles to download
    private static final int ARTICLES_LIMIT = 20;

    // Current characters being accumulated
    StringBuffer chars = new StringBuffer();

    // Current characters being accumulated
    int cap = new StringBuffer().capacity();

    // Basic Booleans
    private boolean wantedItem = false;
    private boolean wantedHeadline = false;
    private boolean wantedTitle = false;

    public List<Article> getArticleList() {
        return articleList;
    }

    public Article getParsedData() {
        return this.currentArticle;
    }

    public RssHandler() {
        this.currentArticle = new Article();
    }

    public void startElement(String uri, String localName, String qName,
            Attributes atts) {
        chars = new StringBuffer();

    }

    public void endElement(String uri, String localName, String qName)
            throws SAXException {

        if (localName.equalsIgnoreCase("title")) {
            currentArticle.setTitle(chars.toString());
        } else if (localName.equalsIgnoreCase("subtitle")) {
            currentArticle.setDescription(chars.toString());
        } else if (localName.equalsIgnoreCase("pubdate")) {
            currentArticle.setPubDate(chars.toString());
        } else if (localName.equalsIgnoreCase("guid")) {
            currentArticle.setGuid(chars.toString());
        } else if (localName.equalsIgnoreCase("author")) {
            currentArticle.setAuthor(chars.toString());
        } else if (localName.equalsIgnoreCase("link")) {
            currentArticle.setEncodedContent(chars.toString());
        } else if (localName.equalsIgnoreCase("item")) 

        // Check if looking for article, and if article is complete
        if (localName.equalsIgnoreCase("item")) {

            articleList.add(currentArticle);

            currentArticle = new Article();

            // Lets check if we've hit our limit on number of articles
            articlesAdded++;
            if (articlesAdded >= ARTICLES_LIMIT) {
                throw new SAXException();
            }
        }
        chars.setLength(0);
    }
    public void characters(char ch[], int start, int length) {
        chars.append(ch, start, length);

    }
}

アプリケーションをデバッグするときは常に、qName が Item の直接の子になることはありません。

RSS → チャンネル → アイテム → タイトル → 説明...

私は無知です。助けてください!

4

1 に答える 1

0

1) endElement() メソッドの最後で、文字の長さをリセットしていません。

   public void endElement(String uri, String localName, String qName)
        throws SAXException {

    //...           
    //Reset 'chars' length at the end always.
    chars.setLength(0);
    }

2) 以下のように characters(...) メソッドを変更します。

    public void characters(char ch[], int start, int length) {
        chars.append(ch, start, length);
    }

[編集

3) 「chars」の初期化を「startElement」からコンストラクターに移動します。すなわち:

public RssHandler() {
    this.currentArticle = new Article();
    //Add here..
    chars = new StringBuffer();
}

と、

public void startElement(String uri, String localName, String qName,
        Attributes atts) {
    //Remove below line..
    //chars = new StringBuffer();
}

4) 最後に、localName の代わりに qName を使用して一致するタグをチェックします。

    if (qName.equalsIgnoreCase("title")) {
        currentArticle.setTitle(chars.toString().trim());
    } else if (qName.equalsIgnoreCase("subtitle")) {
        currentArticle.setDescription(chars.toString().trim());
    } //... 

編集]

詳細情報 @ Android での SAXParser の使用

于 2013-06-21T16:00:19.377 に答える