在 Android 中调试 SAX 解析器处理程序时需要帮助

发布于 2024-12-19 18:06:51 字数 7458 浏览 1 评论 0原文

这些天我有一个非常好奇的问题困扰着我,我检查了代码的每个角落,没有发现任何错误,但是我的 sax 解析器类不断记录错误,我快疯了,这是怎么回事?有人可以帮助我吗?

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;
    }
  }

My Class 调用 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): 显示的活动 com.appkon.hdtvs/.HDtvs: 10008 毫秒(总计 8324825 毫秒)
12-05 04:47:02.150: WARN/ActivityManager(58): HistoryRecord{44d867b8 com.appkon.hdtvs/.HDtvs} 的活动空闲超时
12-05 04:47:07.560:DEBUG/dalvikvm(205):GC 在 193 毫秒内释放了 113 个对象/5056 字节
12-05 04:47:12.560:DEBUG/dalvikvm(103):GC 在 241 毫秒内释放了 2698 个对象/155704 字节
12-05 04:47:17.060: INFO/HDtvs(345): 路径 = http://appkon.com/hdtvs/channel/bigbang2.xml
12-05 04:47:17.081:INFO / ActivityManager(58):启动活动:意图{ cmp = com.appkon.hdtvs / .Showlist(有额外内容)}
12-05 04:47:17.501:DEBUG / Showlist(345):getRSS路径http://appkon.com/hdtvs/channel/bigbang2.xml
12-05 04:47:17.510:调试/显示列表(345):阅读器正常
12-05 04:47:17.520:调试/显示列表(345):已附加处理程序
12-05 04:47:19.700: 错误/showlist(345): getRSS 异常
12-05 04:47:19.700: INFO/Showlist(345): 路径 = 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):显示的活动 com.appkon.hdtvs/.Showlist:3451 毫秒(总计 3451 毫秒)

I have this very curious problem bothering me thiese days and I checked every corner of my codes and find no error at all, but my sax parser class keep logging error, I am going mad,what's wrong with this? can anybody help me?

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);
        }
      } 
}

My XML file

<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;
    }
  }

My Class which call the 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;
  }

the problem is ,I ran the program and the logcat keep logging getRSS exception and the listview shows nothing.

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

a√萤火虫的光℡ 2024-12-26 18:06:51

对于调试过程中的未来帮助:

您需要打印确切的堆栈跟踪以了解发生了什么

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

,或者

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

至于您面临的问题,可能是因为您尝试读取的 xml 文件有 404-ed

For future help during debugging :

You need to print the exact stack trace to know what's going on

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

or

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

As for the problem you are facing, it is probably because the xml file you are trying to read has 404-ed

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文