2012-04-09 10 views
1

私はSAXライブラリを使用してRSS/Atom Feedドキュメントを読むことができる小さなAndroidプロジェクトを実行しています。デフォルトのRSSソースはすべてうまく動作しますが、ソース(空白や改行トークンがない)が最小限に抑えられているので、空白の項目のリストだけが生成されます。 Log catのMy logにも何も表示されません。私は変種RSSサイトでこの問題を再確認しますが、それでも問題はあります。以下は、私がフィード - ソースSAXParserは最小化されたXML文書で何も捕まえません

public class RssContentHandler extends DefaultHandler { 
    private static final int UNKNOWN_STATE = -1; 
    private static final int ELEMENT_START = 0; 
    private static final int TITLE_END = 1; 
    private static final int DESCRIPTION_END = 2; 
    private static final int LINK_END = 3; 
    private static final int PUBDATE_END = 4; 
    private static final int CHANNEL_END = 5; 

    private int iState = UNKNOWN_STATE; 
    private String fullCharacters; 
    private boolean itemFound = false; 
    private RssItem rssItem; 
    private RssFeed rssFeed; 

    public RssContentHandler() { 
    } 

    public RssFeed getFeed() { 
     return this.rssFeed; 
    } 

    @Override 
    public void startDocument() { 
     rssItem = new RssItem(); 
     rssFeed = new RssFeed(); 
     Log.i("startDocument", "startDocument"); 
    } 

    @Override 
    public void endDocument() { 
    } 

    @Override 
    public void startElement(String _uri, String _localName, String _qName, Attributes _attributes) { 
     if (_localName.equalsIgnoreCase("item")) { 
      itemFound = true; 
      rssItem = new RssItem(); 
      this.iState = UNKNOWN_STATE; 
     } else 
      this.iState = ELEMENT_START; 
     fullCharacters = ""; 
    } 

    @Override 
    public void endElement(String _uri, String _localName, String _qName) { 
     if (_localName.equalsIgnoreCase("item")) 
      this.rssFeed.addItem(this.rssItem); 
     else if (_localName.equalsIgnoreCase("title")) 
      this.iState = TITLE_END; 
     else if (_localName.equalsIgnoreCase("description")) 
      this.iState = DESCRIPTION_END; 
     else if (_localName.equalsIgnoreCase("link")) 
      this.iState = LINK_END; 
     else if (_localName.equalsIgnoreCase("pubDate")) 
      this.iState = PUBDATE_END; 
     else if (_localName.equalsIgnoreCase("channel")) 
      this.iState = CHANNEL_END; 
     else 
      this.iState = UNKNOWN_STATE; 
    } 

    @Override 
    public void characters(char[] _ch, int _start, int _length) { 
     String strCharacters = new String(_ch, _start, _length); 
     if (this.iState == ELEMENT_START) 
      fullCharacters += strCharacters; 
     else { 
      if (!itemFound) { 
       switch (this.iState) { 
       case TITLE_END: 
        this.rssFeed.setTitle(fullCharacters); 
        break; 
       case DESCRIPTION_END: 
        this.rssFeed.setDescription(fullCharacters); 
        break; 
       case LINK_END: 
        this.rssFeed.setLink(fullCharacters); 
        break; 
       case PUBDATE_END: 
        this.rssFeed.setPubDate(fullCharacters); 
        break; 
       } 
      } else { 
       switch (this.iState) { 
       case TITLE_END: 
        this.rssItem.setTitle(fullCharacters); 
        Log.i("characters", fullCharacters); 
        break; 
       case DESCRIPTION_END: 
        this.rssItem.setDescription(fullCharacters); 
        break; 
       case LINK_END: 
        this.rssItem.setLink(fullCharacters); 
        break; 
       case PUBDATE_END: 
        this.rssItem.setPubDate(fullCharacters); 
        break; 
       } 
      } 
      this.iState = UNKNOWN_STATE;    
     } 
    } 
} 

を処理し、セットアップにパーサをスニペットに使用DefaultHandlerの私の継承クラスである:

HttpClient client = new DefaultHttpClient(); 
    HttpGet request = new HttpGet(); 
    try { 
     request.setURI(new URI(_strUrl)); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 
    HttpResponse response = client.execute(request); 
    Reader inputStream = new InputStreamReader(response.getEntity().getContent()); 
    RssContentHandler rssContentHandler = new RssContentHandler(); 
    InputSource inputSource = new InputSource(); 
    inputSource.setCharacterStream(inputStream); 

    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); 
    SAXParser saxParser = saxParserFactory.newSAXParser(); 
    saxParser.parse(inputSource, rssContentHandler); 

    this.rssFeed = rssContentHandler.getFeed(); 

P/S:私はのためのVirtualBoxにインストールされているアンドロイド2.3のx86を使用していますこれらのソースはうまく動作し、内蔵のRSSリーダーアプリはx86版に付属しています。ここで何が間違っていますか?

答えて

1

_localNameではなく_qNameで試してください。

xmlにはCDATAが含まれているため、現在のパーサーでXML応答を解析することはできません。 Raw HTMLを解析するには、LexicalHandlerを使用する必要があります。

public class MyHandler implements LexicalHandler { 

    public void startDTD(String name, String publicId, String systemId) 
    throws SAXException {} 
    public void endDTD() throws SAXException {} 
    public void startEntity(String name) throws SAXException {} 
    public void endEntity(String name) throws SAXException {} 
    public void startCDATA() throws SAXException {} 
    public void endCDATA() throws SAXException {} 

    public void comment (char[] text, int start, int length) 
    throws SAXException { 

    String comment = new String(text, start, length); 
    System.out.println(comment); 

    } 

メモリが問題でない場合は、DOMを使用してXMLを解析することもできます。詳細はこちらHandling Lexical Events

+0

まだ動作していないサンプルXMLを提供できますか? – Shehzad

+0

この場合の例は[link](http://genk.vn/trang-chu.rss)です。 ) –

+0

私は自分の答えを編集しました。 – Shehzad

関連する問題