2012-10-16 155 views
3

我试图使用SAX解析器SAX RSS FEED解析器

这是我的代码来解析一个RSS提要:

public class MainActivity extends Activity { 
    ArrayList<ArrayList<String>> data = new ArrayList<ArrayList<String>>(); 
    ListView list; 
    ArrayList<String> sinlgeItem = null; 
    ProgressDialog pd; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     list=(ListView)findViewById(R.id.list); 
     boolean b=parseData(); 
     Log.v("result", "value"+b); 
     for(int i=0;i<data.size();i++){ 
      Log.e("ITEM",data.get(i).get(0)+"__"+data.get(i).get(1)); 
     } 
    } 
    /** 
    * method parse the data 
    */ 
    private boolean parseData() { 
     try { 
      SAXParserFactory spf = SAXParserFactory.newInstance(); 
      SAXParser sp = spf.newSAXParser(); 
      XMLReader xr = sp.getXMLReader(); 
      URL url = new URL("https://itunes.apple.com/WebObjects/MZStore.woa/wpa/MRSS/newreleases/sf=143441/limit=25/rss.xml"); 
      xr.setContentHandler(new MyHandler()); 
      xr.parse(new InputSource(url.openStream())); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return true; 
    } 

    public class MyHandler extends DefaultHandler{ 
     Boolean ITEM=false; 
     @Override 
     public void characters(char[] ch, int start, int length) throws SAXException { 
      super.characters(ch, start, length); 
     } 
     @Override 
     public void endElement(String uri, String localName, String name) throws SAXException { 
      super.endElement(uri, localName, name); 
      if (ITEM){ 
       RootElement root=new RootElement("rss"); 
       Element chan=root.getChild("channel"); 
       Element itms=chan.getChild("item"); 
       Element title=itms.getChild("title"); 
       Element artist=itms.getChild("http://phobos.apple.com/rss/1.0/modules/itms/", "artist"); 
       title.setEndTextElementListener(new EndTextElementListener() { 
        public void end(String body) { 
         sinlgeItem.add(body); 
         Log.v("title",body); 
        } 
       }); 
       artist.setEndTextElementListener(new EndTextElementListener() { 
        public void end(String body) { 
         sinlgeItem.add(body); 
         Log.v("artist", body); 
        } 
       }); 
       ITEM=false; 
       data.add(sinlgeItem); 
      } 
     } 

     @Override 
    public void startDocument() throws SAXException { 
     super.startDocument(); 

    } 

    @Override 
    public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { 
      super.startElement(uri, localName, name, attributes); 
      if (localName.equals("item")){ 
       sinlgeItem = new ArrayList<String>(); 
       ITEM=true; 
      } 
     } 
    } 
} 

这是链接到XML提要 https://itunes.apple.com/WebObjects/MZStore.woa/wpa/MRSS/newreleases/sf=143441/limit=25/rss.xml

我尝试使用item标签和元素itms:artist来解析标题元素。
我不知道如何处理标签名称空间

回答

1

我不认为你应该使用SAXParser来解析RSS。使用XML Pull Parser会更容易。我会选择SAXParser来解析连续的客户端 - 服务器通信,比如XMPP协议,因为SAX最适合解析不完整和连续的XML。

2
+0

其实我也问题与_namespaces_元素,u能告诉我如何处理它。还有一个如果像_title_这样的元素是它的一部分,那么标签**项**和**通道**的一部分,那么我怎样才能控制只读取标签**项**的_title_元素 – jaya

+0

[使用saxparser的命名空间]( http://stackoverflow.com/questions/7815526/how-to-parse-xml-with-namespace-using-android-sax-parser) – Harish