2

RSS フィードを読み取る ANDROID アプリを作成しようとしているので、このチュートリアル ( http://android-er.blogspot.com/2010/05/simple-rss-reader-ii-implement-with.html )を使用し、独自の URL RSS フィーダーに実装しました。しかし、説明タグは表示されません..ほとんどの場合、フィーダーの xml の cz 説明タグは CDATA です。RSS の説明 cdata を解析するにはどうすればよいですか??ありがとう! ここに私のRSSHandlerコードがあります:

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

public class RSSHandler extends DefaultHandler {

final int state_unknown = 0;
final int state_title = 1;
final int state_description = 2;
final int state_link = 3;
final int state_pubdate = 4;
int currentState = state_unknown;

RSSFeed feed;
RSSItem item;

boolean itemFound = false;

 RSSHandler(){
}

RSSFeed getFeed(){
   return feed;
 }

@Override
  public void startDocument() throws SAXException {
   // TODO Auto-generated method stub
   feed = new RSSFeed();
   item = new RSSItem();

   }

@Override
   public void endDocument() throws SAXException {
   // TODO Auto-generated method stub
   }

@Override
 public void startElement(String uri, String localName, String qName,
    Attributes attributes) throws SAXException {
// TODO Auto-generated method stub

if (localName.equalsIgnoreCase("item")){
    itemFound = true;
    item = new RSSItem();
    currentState = state_unknown;
}
else if (localName.equalsIgnoreCase("title")){
    currentState = state_title;
}
else if (localName.equalsIgnoreCase("description")){
    currentState = state_description;
}
else if (localName.equalsIgnoreCase("link")){
    currentState = state_link;
}
else if (localName.equalsIgnoreCase("pubdate")){
    currentState = state_pubdate;
}
else{
    currentState = state_unknown;
}

 }

 @Override
   public void endElement(String uri, String localName, String qName)
    throws SAXException {
// TODO Auto-generated method stub
if (localName.equalsIgnoreCase("item")){
    feed.addItem(item);
}
}

 @Override
    public void characters(char[] ch, int start, int length)
    throws SAXException {
// TODO Auto-generated method stub

String strCharacters = new String(ch,start,length);

if (itemFound==true){
// "item" tag found, it's item's parameter
    switch(currentState){
    case state_title:
        item.setTitle(strCharacters);
        break;
    case state_description:
        item.setDescription(strCharacters);
        break;
    case state_link:
        item.setLink(strCharacters);
        break;
    case state_pubdate:
        item.setPubdate(strCharacters);
        break;  
    default:
        break;
    }
}
else{
// not "item" tag found, it's feed's parameter
    switch(currentState){
    case state_title:
        feed.setTitle(strCharacters);
        break;
    case state_description:
        feed.setDescription(strCharacters);
        break;
    case state_link:
        feed.setLink(strCharacters);
        break;
    case state_pubdate:
        feed.setPubdate(strCharacters);
        break;  
    default:
        break;
    }
}

currentState = state_unknown;
  }

ここに私のRSSReaderコードがあります:

       public class AndroidRssReader extends ListActivity {

private RSSFeed myRssFeed = null;
//private ArrayList<RSSItem> myRssFeed = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    try {
        //URL rssUrl = new URL("http://www.gov.hk/en/about/rss/govhkrss.data.xml");
        URL rssUrl = new URL("http://www.merehbi.com/online/index.php?option=com_content&view=category&layout=blog&id=58&Itemid=155&lang=ar&format=feed&type=rss");
        SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
        SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
        XMLReader myXMLReader = mySAXParser.getXMLReader();
        RSSHandler myRSSHandler = new RSSHandler();
        myXMLReader.setContentHandler(myRSSHandler);
        InputSource myInputSource = new InputSource(rssUrl.openStream());
        myXMLReader.parse(myInputSource);

    myRssFeed = myRSSHandler.getFeed(); 
    } catch (MalformedURLException e) {
        e.printStackTrace();    
    } catch (ParserConfigurationException e) {
        e.printStackTrace();    
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();    
    }

    if (myRssFeed!=null)
    {
        TextView feedTitle = (TextView)findViewById(R.id.feedtitle);
        TextView feedDescribtion = (TextView)findViewById(R.id.feeddescribtion);
        TextView feedPubdate = (TextView)findViewById(R.id.feedpubdate);
        TextView feedLink = (TextView)findViewById(R.id.feedlink);
        feedTitle.setText(myRssFeed.getTitle());
        feedDescribtion.setText(myRssFeed.getDescription());
        feedPubdate.setText(myRssFeed.getPubdate());
        feedLink.setText(myRssFeed.getLink());

        ArrayAdapter<RSSItem> adapter =
                new ArrayAdapter<RSSItem>(this,
                        android.R.layout.simple_list_item_1,myRssFeed.getList());
        setListAdapter(adapter);    
    }   
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    Intent intent = new Intent(this,ShowDetails.class);
    Bundle bundle = new Bundle();
    bundle.putString("keyTitle", myRssFeed.getItem(position).getTitle());
    bundle.putString("keyDescription", myRssFeed.getItem(position).getDescription());
    bundle.putString("keyLink", myRssFeed.getItem(position).getLink());
    bundle.putString("keyPubdate", myRssFeed.getItem(position).getPubdate());
    intent.putExtras(bundle);
    startActivity(intent);  
}
    }
4

1 に答える 1

-2

私はこのチュートリアルとそのコードを使用します http://www.androidhive.info/2011/11/android-xml-parsing-tutorial/

この回答でいくつかのコードを変更します https://stackoverflow.com/a/8489223/3636653

      public static void main(String[] args) throws Exception {
    File file = new File("data.xml");
    DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document doc = builder.parse(file);

    NodeList nodes = doc.getElementsByTagName("topic");
    for (int i = 0; i < nodes.getLength(); i++) {
      Element element = (Element) nodes.item(i);
      NodeList title = element.getElementsByTagName("title");
      Element line = (Element) title.item(0);
      System.out.println("Title: " + getCharacterDataFromElement(line));
    }
  }
  public static String getCharacterDataFromElement(Element e) {
    Node child = e.getFirstChild();
    if (child instanceof CharacterData) {
      CharacterData cd = (CharacterData) child;
      return cd.getData();
    }
    return "";
  }
于 2014-07-26T08:40:59.557 に答える