1

StringBuilder という名前のオブジェクトを使用してみましたが、まだ説明タグからすべての CDATA を取得していません。xml はEvents-Ovations365 にあります。

基本的に、CDATA を 1 行で取得するだけです。

img は : http://www.ovations365.com/sites/ovations365.com/images/org/81/newtown_medium.jpg

alt="オクマルギ ヘリテージ トレイルのリボンカット">

package com.example.ovations_proj;

import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

import com.example.ovations_proj.RssItem;


public class RssParseHandler extends DefaultHandler {

    private List<RssItem> rssItems;

    // Used to reference item while parsing
    private RssItem currentItem;

    // Parsing title indicator
    private boolean parsingTitle; 
    // Parsing link indicator
    private boolean parsingLink; 
    private boolean parsingDes;

    StringBuilder obj;


    public RssParseHandler() {
        rssItems = new ArrayList<RssItem>();
    }

    public List<RssItem> getItems() {
        return rssItems;
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println("Start Element :" + qName);
        if ("item".equals(qName)) { //item
            currentItem = new RssItem();
        }else if ("description".equals(qName) ) { //description
            obj = new StringBuilder();
            parsingDes = true;
        }

    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.println("End Element :" + qName);
        if ("item".equals(qName)) {
            rssItems.add(currentItem);//item
            currentItem = null;         
        } else if ("description".equals(qName)) {   //description           
            String theFullText = obj.toString();
            System.out.println("fulltext data:  "  + theFullText);
            parsingDes = false;         
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (parsingTitle) {
            if (currentItem != null){
                currentItem.setTitle(new String(ch, start, length));                
            }
        } else if (parsingDes) {       
            if (currentItem != null && obj!=null ) {                                
                obj.append(ch, start, length);  
                parsingDes = false;
            }
        }
    }
}
4

2 に答える 2

3

これはおそらく、文字メソッドを正しく実装していないためです。Oracle のチュートリアルを参照してください。

パーサーは、一度に特定の数の文字を返す必要はありません。パーサーは、一度に 1 文字から最大数千文字まで何でも返すことができ、それでも標準準拠の実装です。そのため、アプリケーションで検出した文字を処理する必要がある場合は、characters() メソッドで文字を java.lang.StringBuffer に蓄積し、すべての文字が見つかったことが確実な場合にのみ操作することをお勧めします。

あなたのコードは、1 回の呼び出しで要素のテキスト全体を取得していると想定していますが、それは保証されていません。characters メソッドは、見つかったテキストをStringBuffer(または StringBuilder またはその他のデータ構造) に蓄積する必要がありますが、蓄積されたテキストをどう処理するかについての決定は、endElementメソッドなどの別の場所で行う必要があります。文字メソッドで時期尚早にフラグを設定し、残りのテキストが失われているようです。

于 2013-04-02T12:17:01.190 に答える
0

コメントアウトされたコードを台無しにして、私にとってうまくいったのは次のとおりです。私の parsingDes フラグは、追加を 1 つだけ引き起こしていました。

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
    if (parsingTitle) {
        if (currentItem != null){
            currentItem.setTitle(new String(ch, start, length));                
        }
    } else if (parsingLink) { 
        if (currentItem != null) {
            currentItem.setLink(new String(ch, start, length));
            parsingLink = false;
        }
    } else if (parsingDes) {       
        if (currentItem != null){// && obj!=null ) {
            obj.append(ch, start, length);
            //parsingDes = false;
        }
    }
于 2013-04-02T20:27:53.733 に答える