0

RSSリーダーを開発しています。このコードを実行すると、localNameとuriは空になります。RSSフィードを解析しています。次のコードを実行しています。同じコードが別のAndroidプロジェクトで正常に機能しています。

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

    String name;
    if (localName == "" ){
        name = qName;
    }
    else{
        name = localName;
    }

    if (name.equalsIgnoreCase("title")) {
        currentPost.setTitle(chars.toString());
    }
    if (name.equalsIgnoreCase("link")) {
        currentPost.setLink(chars.toString());
    }
    if (name.equalsIgnoreCase("content")
            && currentPost.getContent() == null) {
        currentPost.setContent(chars.toString());
    }
    if (name.equalsIgnoreCase("item")) {
        currentPost.setFeed(feed);
        Posts.Instance().add(currentPost);
        currentPost = new Post();
    }
}
4

1 に答える 1

1

APIによると

パラメーター:

uri - 名前空間 URI、または要素に名前空間 URI がない場合、または名前空間処理が実行されていない場合は空の文字列。

localName - ローカル名 (プレフィックスなし)、またはネームスペース処理が実行されていない場合は空の文字列。

...

特に要素の値に空白が含まれている場合、文字メソッドはタグ内で複数回呼び出される可能性があります。

characters() ドキュメント内

パーサーはこのメソッドを呼び出して、文字データの各チャンクを報告します。SAX パーサーは、連続するすべての文字データを 1 つのチャンクで返すか、複数のチャンクに分割します。ただし、ロケータが有用な情報を提供できるように、単一のイベントのすべての文字は同じ外部エンティティから取得する必要があります。

したがって、

SAX パーサーを作成するときは、StringBuilder を使用して、characters() に渡されたすべてのものを追加します。

public void characters (char ch[], int start, int length) {
    if (buf!=null) {
        for (int i=start; i<start+length; i++) {
            buf.append(ch[i]);
        }
    }
}

Then in endElement(), I take the contents of the StringBuilder and do something with it. That way, if the parser calls characters() several times, I don't miss anything.

クレジット: https://stackoverflow.com/a/7182648/643500およびhttps://stackoverflow.com/a/2838338/643500

編集::

http://sujitpal.blogspot.com/2008/07/rss-feed-client-in-java.htmlを読む

于 2012-05-24T20:24:37.103 に答える