2011-01-12 6 views
0

In meiner Anwendung habe ich eine Klasse, die die org.xml.sax.helpers.DefaultHandler -Klasse erweitert. Es ist Zweck, RSS Feeds zu lesen. Mein Problem ist, dass beim Erreichen des "Enclosure-Tags" die Zeichenmethode nicht aufgerufen wird, sodass ich die URL des Images nicht extrahieren kann. Weiß jemand, warum passiert das?Zeichen Methode nicht für das Gehäuse Tag

public class RSSHandler extends DefaultHandler { 

private RSSFeed feed; 
private RSSItem item; 
boolean bFoundChannel = false; 
final int RSS_TITLE = 1; 
final int RSS_LINK = 2; 
final int RSS_DESCRIPTION = 3; 
final int RSS_CATEGORY = 4; 
final int RSS_PUBDATE = 5; 
final int RSS_ENCLOSURE = 6; 

int depth = 0; 
int currentstate = 0; 

private final String CHANNEL_ELEMENT = "channel"; 
private final String IMAGE_ELEMENT = "image"; 
private final String ITEM_ELEMENT = "item"; 
private final String TITLE_ELEMENT = "title"; 
private final String DESCRIPTION_ELEMENT = "description"; 
private final String LINK_ELEMENT = "link"; 
private final String CATEGORY_ELEMENT = "category"; 
private final String PUBDATE_ELEMENT = "pubDate"; 
private final String ENCLOSURE_ELEMENT = "enclosure"; 

private final String LESS_THAN_SIGN = "<"; 
private final String GREATER_THAN_SIGN = ">"; 
private final String IMAGE_SOURCE_PATTERN = "src='(.*?)'"; 

/* 
* getFeed - this returns our feed when all of the parsing is complete 
*/ 
public RSSFeed getFeed() { 
    return feed; 
} 

public void startDocument() throws SAXException { 
    // initialize our RSSFeed object - this will hold our parsed contents 
    feed = new RSSFeed(); 
    // initialize the RSSItem object - we will use this as a crutch to grab the info from the channel 
    // because the channel and items have very similar entries.. 
    item = new RSSItem(); 
} 

public void endDocument() throws SAXException { 
} 

public void startElement(String namespaceURI, String localName,String qName, Attributes atts) throws SAXException { 
    System.out.println("###START_ELEMENT - localName: " + localName + 
      "; qName: " + qName); 
    depth++; 
    if (localName.equals(CHANNEL_ELEMENT)) { 
     currentstate = 0; 
     return; 
    } else if (localName.equals(IMAGE_ELEMENT)) { 
     // record our feed data - we temporarily stored it in the item :) 
     feed.setTitle(item.getTitle()); 
     feed.setPubDate(item.getPubDate()); 
    } else if (localName.equals(ITEM_ELEMENT)) { 
     // create a new item 
     item = new RSSItem(); 
     return; 
    } else if (localName.equals(TITLE_ELEMENT)) { 
     currentstate = RSS_TITLE; 
     return; 
    } else if (localName.equals(DESCRIPTION_ELEMENT)) { 
     currentstate = RSS_DESCRIPTION; 
     return; 
    } else if (localName.equals(LINK_ELEMENT)) { 
     currentstate = RSS_LINK; 
     return; 
    } else if (localName.equals(CATEGORY_ELEMENT)) { 
     currentstate = RSS_CATEGORY; 
     return; 
    } else if (localName.equals(PUBDATE_ELEMENT)) { 
     currentstate = RSS_PUBDATE; 
     return; 
    } else if (localName.equals(ENCLOSURE_ELEMENT)) { 
     System.out.println("====>> ENCLOSURE_ELEMENT"); 
     currentstate = RSS_ENCLOSURE; 
     return; 
    } 
    // if we don't explicitly handle the element, make sure we don't wind up erroneously 
    // storing a newline or other bogus data into one of our existing elements 
    currentstate = 0; 
} 

public void endElement(String namespaceURI, String localName, String qName) throws SAXException { 
    depth--; 
    if (localName.equals(ITEM_ELEMENT)) { 
     // add our item to the list! 
     feed.addItem(item); 
     return; 
    } 
} 

public void characters(char ch[], int start, int length) { 
    String theString = new String(ch,start,length); 
    Log.i("RSSReader","_______characters[" + theString + "] - currentstate: " + currentstate); 

    if (theString.equals(LESS_THAN_SIGN) || theString.equals(GREATER_THAN_SIGN) 
      || (theString.trim().length() == 0)) { 
     return; 
    } 

    switch (currentstate) { 
    case RSS_TITLE: 
     item.setTitle(theString); 
     break; 
    case RSS_LINK: 
     item.setLink(theString); 
     break; 
    case RSS_DESCRIPTION: 
     item.setDescription(theString); 
     break; 
    case RSS_CATEGORY: 
     item.setCategory(theString); 
     break; 
    case RSS_PUBDATE: 
     item.setPubDate(theString); 
     break; 
    case RSS_ENCLOSURE: 
     Pattern p = Pattern.compile(IMAGE_SOURCE_PATTERN); 
     Matcher m = p.matcher(theString); 
     if (m.find()) { 
      try { 
       Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(m.group(1)).getContent()); 
       item.setImage(bitmap); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     break; 
    default: 
     return; 
    } 
} 

Vielen Dank,

Gratzi

+0

Sie sollten den Code posten, den Sie zum Parsen verwenden; Es gibt keinen Grund für das Gehäusen-Tag, das dazu führen würde, dass es nicht aufgerufen wird. – kcoppock

+0

Ich habe den Code hinzugefügt – Gratzi

Antwort

0

this Ansatz hat mir geholfen, das Problem zu lösen.

Verwandte Themen