Нужна помощь в отладке обработчика парсера SAX в Android

1

У меня есть эта очень любопытная проблема, которая беспокоит меня в течение нескольких дней, и я проверил каждый уголок своих кодов и не обнаружил ошибки вообще, но мой класс парсеров саксофона продолжает регистрировать ошибку, я схожу с ума, что с этим не так? Кто-нибудь может мне помочь?

MyHandler

    public class MyHandler extends DefaultHandler
{ 

      private boolean in_episode = false;
      private boolean in_name = false;
      private boolean in_link = false;
      private boolean in_desc = false;
      private boolean in_date = false;
      private List<Episode> li;
      private Episode episodes;
      private StringBuffer buf=new StringBuffer();

      /* 将转换成List<News>的XML数据回传 */
      public List<Episode> getParsedData()
      { 
        return li; 
      }
      /* XML文件开始解析时调用此method */
      @Override 
      public void startDocument() throws SAXException
      { 
        li = new ArrayList<Episode>(); 
      } 
      /* XML文件结束解析时调用此method */
      @Override 
      public void endDocument() throws SAXException
      {
      } 
      /* 解析到Element的开头时调用此method */
      @Override 
      public void startElement(String namespaceURI, String localName, 
                   String qName, Attributes atts) throws SAXException
      { 
        if (localName.equals("episode"))
        { 
          this.in_episode = true;
          /* 解析到item的开头时new一个News对象 */
          episodes=new Episode();
        }
        else if (localName.equals("name"))
        { 
          if(this.in_episode)
          {
            this.in_name = true;
          }

        }
        else if (localName.equals("link"))
        { 
          if(this.in_episode)
          {
            this.in_link = true;
          }
        }
        else if (localName.equals("desc"))
        { 
          if(this.in_episode)
          {
            this.in_desc = true;
          }
        }
        else if (localName.equals("pubdate"))
        { 
          if(this.in_episode)
          {
            this.in_date = true;
          }
        } 
      }
      /* 解析到Element的结尾时调用此method */
      @Override 
      public void endElement(String namespaceURI, String localName,
                             String qName) throws SAXException
      { 
        if (localName.equals("episode"))
        { 
          this.in_episode = false;
          /* 解析到item的结尾时将News对象写入List中 */
          li.add(episodes);
        }
        else if (localName.equals("name"))
        { 
          if(this.in_episode)
          {
            /* 设定News对象的name */
            episodes.setname(buf.toString().trim());
            buf.setLength(0);
            this.in_name = false;
          }

        }
        else if (localName.equals("link"))
        { 
          if(this.in_episode)
          {
            /* 设定News对象的link */
            episodes.setLink(buf.toString().trim());
            buf.setLength(0);
            this.in_link = false;
          }
        }
        else if (localName.equals("desc"))
        { 
          if(in_episode)
          {
            /* 设定News对象的description */
            episodes.setDesc(buf.toString().trim());
            buf.setLength(0);
            this.in_desc = false;
          }
        }
        else if (localName.equals("pubdate"))
        { 
          if(in_episode)
          {
            /* 设定News对象的pubDate */
            episodes.setDate(buf.toString().trim());
            buf.setLength(0);
            this.in_date = false;
          }
        } 
      } 
      /* 取得Element的开头结尾中间夹的字符串 */
      @Override 
      public void characters(char ch[], int start, int length)
      { 
        if(this.in_episode)
        {
          /* 将char[]加入StringBuffer */
          buf.append(ch,start,length);
        }
      } 
}

Мой XML файл

<item>
<episode id="1">
  <name>1</name>
  <link>http://111</link>
  <desc>111</desc>

</episode>

<episode id="2">
  <name>2</name>
  <link>http://222</link>
  <desc>222</desc>

</episode>
</item>

MyAdapter

public class MyAdapter extends BaseAdapter {


    private LayoutInflater mInflater;
    private List<Episode> items;


    /* MyAdapter的建构子,传入两个参数  */  
    public MyAdapter(Context context,List<Episode> it)
    {
      /* 参数初始化 */
      mInflater = LayoutInflater.from(context);
      items = it;
    }

    /* 因继承BaseAdapter,需重写以下method */
    @Override
    public int getCount()
    {
      return items.size();
    }

    @Override
    public Object getItem(int position)
    {
      return items.get(position);
    }

    @Override
    public long getItemId(int position)
    {
      return position;
    }

    @Override
    public View getView(int position,View convertView,ViewGroup par)
    {
      ViewHolder holder;

      if(convertView == null)
      {
        /* 使用自定义的news_row作为Layout */
        convertView = mInflater.inflate(R.layout.episode, null);
        /* 初始化holder的text与icon */
        holder = new ViewHolder();
        holder.text = (TextView) convertView.findViewById(R.id.episode);      
        convertView.setTag(holder);
      }
      else
      {
        holder = (ViewHolder) convertView.getTag();
      }
      Episode tmpN=(Episode)items.get(position);
      holder.text.setText(tmpN.getname());

      return convertView;
    }

    /* class ViewHolder */
    private class ViewHolder
    {
      TextView text;
    }
  }

Мой класс, который называется SaxParser

private List<Episode> getRss(String path)
  {
    List<Episode> data=new ArrayList<Episode>();
    URL url = null;     
    try
    {  
      url = new URL(path);
      Log.d("Showlist", "getRSS path " + path);
      SAXParserFactory spf = SAXParserFactory.newInstance(); 
      SAXParser sp = spf.newSAXParser(); 
      Log.d("Showlist", "Reader ok");
      XMLReader xr = sp.getXMLReader(); 
      /* 设定自定义的MyHandler给XMLReader */ 
      MyHandler myExampleHandler = new MyHandler(); 
      xr.setContentHandler(myExampleHandler);     
      Log.d("Showlist", "Handler attached");
      xr.parse(new InputSource(url.openStream()));
      Log.d("Showlist", "RSScontent ok");
      data =myExampleHandler.getParsedData(); 
      Log.d("Showlist", "DataRead ok");
    }
    catch (Exception e)
    { 
        Log.e("showlist", "getRSS exception");
    }
    return data;
  }

проблема в том, что я запускал программу, и logcat продолжал вести журнал getRSS исключение, и в списке ничего не отображается.

12-05 04:47:02.130: INFO/ActivityManager(58): Displayed activity com.appkon.hdtvs/.HDtvs: 10008 ms (total 8324825 ms)
12-05 04:47:02.150: WARN/ActivityManager(58): Activity idle timeout for HistoryRecord{44d867b8 com.appkon.hdtvs/.HDtvs}
12-05 04:47:07.560: DEBUG/dalvikvm(205): GC freed 113 objects / 5056 bytes in 193ms
12-05 04:47:12.560: DEBUG/dalvikvm(103): GC freed 2698 objects / 155704 bytes in 241ms
12-05 04:47:17.060: INFO/HDtvs(345): path = http://appkon.com/hdtvs/channel/bigbang2.xml
12-05 04:47:17.081: INFO/ActivityManager(58): Starting activity: Intent { cmp=com.appkon.hdtvs/.Showlist (has extras) }
12-05 04:47:17.501: DEBUG/Showlist(345): getRSS path http://appkon.com/hdtvs/channel/bigbang2.xml
12-05 04:47:17.510: DEBUG/Showlist(345): Reader ok
12-05 04:47:17.520: DEBUG/Showlist(345): Handler attached
12-05 04:47:19.700: ERROR/showlist(345): getRSS exception
12-05 04:47:19.700: INFO/Showlist(345): path = http://appkon.com/hdtvs/channel/bigbang2.xml
12-05 04:47:19.730: INFO/showlist(345): dblink = http://movie.douban.com/subject/3190880/
12-05 04:47:20.620: INFO/ActivityManager(58): Displayed activity com.appkon.hdtvs/.Showlist: 3451 ms (total 3451 ms)
  • 0
    Вы должны также добавить вывод logcat.
  • 0
    что вы имеете в виду? Я добавил Log.e в раздел исключений catch
Показать ещё 4 комментария
Теги:
parsing
sax

1 ответ

1
Лучший ответ

Для дальнейшей помощи при отладке:

Вам нужно напечатать точную трассировку стека, чтобы узнать, что происходит

  Log.e("YourApp", "getRSS exception" + e );

или

    Log.e("YourApp", "getRSS exception" + e.printStackTrace() );

Что касается проблемы, с которой вы сталкиваетесь, это, вероятно, связано с тем, что файл xml, который вы пытаетесь прочитать, имеет 404-ed

  • 0
    О, похоже, что сервис некоторое время не работал, потому что теперь, похоже, XML сгенерирован правильно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню