【问题标题】:Empty string result when parsing XML using SAXParser in Android在 Android 中使用 SAXParser 解析 XML 时的空字符串结果
【发布时间】:2013-09-16 05:47:17
【问题描述】:

我正在尝试解析来自 RSS 新闻提要的数据,看起来像这样。我正在解析项目的标题、链接、描述和 pubDate 目前,我可以从 Logcat 输出中发现,所有内容都被解析为空字符串。是吗因为 CDATA。我该如何解决这个问题?

    <?xml version="1.0" encoding="UTF-8"?>
     <rss version="2.0">
     <channel>
      <title></title>
      <link></link>
      <description></description>
      <item>
       <title><![CDATA[The news headline is here ]]></title>
       <link></link><!--No CDATA here-->
       <description><![CDATA[News description here]]>
       </description>
       <pubDate><![CDATA[Sat, 14 Sep 2013 10:13:08 +0530]]></pubDate>
      </item>
       ...
      </channel>

我的处理程序如下所示:

     public class OtherHandler extends DefaultHandler
 {
Item item;
ArrayList<Item> channel;
StringBuffer sb;
boolean isItemOn=false;

OtherHandler()
    {
      super();
      sb=new StringBuffer();
}
public void startElement(String uri,String localName,String qName,Attributes attrs) throws SAXException
{
    String name=localName;
    if("".equals(name))
        name=qName;
    if(qName.equals("channel"))
    {
        channel=new ArrayList<Item>();
    }
    if(qName.equals("item"))
    {
        isItemOn=true;
        item=new Item();
    }

}

public void charecters(char[]ch,int offset,int length) throws SAXException
{
    sb.append(new String(ch,offset,length));
}

public void endElement(String uri,String localName,String qName) throws SAXException
{
    String name=localName;
    if("".equals(localName))
        name=qName;
    if(name.equals("item"))
    {
        isItemOn=false;
        channel.add(item);
    }
    if(name.equals("title"))
    {
        if(isItemOn)
        {
            String title=sb.toString();
            item.setTitle(title);
            Log.d("OtherHandler", "Item Title :"+title);
        }    
    }

    if(name.equals("link"))
    {
        if(isItemOn)
        {
            String link=sb.toString();
            item.setLink(link);
            Log.d("OtherHandler","Item Link :"+link);
        }
    }

    if(name.equals("description"))
    {
        if(isItemOn)
        {
            String desc=sb.toString();
            item.setDescription(desc);
            Log.d("OtherHandler","Item description: "+desc);
        }
    }

    if(name.equals("pubDate"))
    {
        String pubDate=sb.toString();
        item.setPublishedDate(pubDate);
        Log.d("OtherHandler","Item pub date: "+pubDate);
    }
}

}

【问题讨论】:

    标签: java android xml sax cdata


    【解决方案1】:

    这是一个界面

    public interface ParserData {
    
        public List<Item> parse();
    
    
    }
    

    我正在实现我创建的接口。

    public class ParseData implements ParserData {
    Item item;
    
    InputStream inputstrm = null;
    
    public ParseRSS(InputStream is) {
        inputstrm = is;
    }
    
    @Override
    public List<Item> parse() {
        // TODO Auto-generated method stub
        RootElement root = new RootElement("channel");
        final List<Item> responsearray = new ArrayList<Item>();
        Element dataset = root.getChild("item");
    
        dataset.setStartElementListener(new StartElementListener() {
    
            @Override
            public void start(Attributes attributes) {
                // TODO Auto-generated method stub
                parameter = new Item();
            }
        });
        dataset.setEndElementListener(new EndElementListener() {
    
            @Override
            public void end() {
                // TODO Auto-generated method stub
                responsearray.add(parameter);
            }
        });
    
        dataset.getChild("title").setEndTextElementListener(
                new EndTextElementListener() {
    
                    @Override
                    public void end(String body) {
                        // TODO Auto-generated method stub
                        parameter.setTitle(body);
                    }
                });
    
        dataset.getChild("link").setEndTextElementListener(
                new EndTextElementListener() {
    
                    @Override
                    public void end(String body) {
                        // TODO Auto-generated method stub
                                               if(body != null)
                        parameter.setLink(body);
                    }
                });
    
    
        try {
            Xml.parse(inputstrm, Xml.Encoding.UTF_8, root.getContentHandler());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        return responsearray;
    }
    

    【讨论】:

    • 我看到您正在覆盖超类中的某些方法。那会是哪个类?
    • 并使用 sax 解析器方法将数据放入列表中。
    • 太棒了,我不得不对其进行一些修改,因为我有一个 rss 元素作为根。
    猜你喜欢
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多