【问题标题】:SAX Rss Parsing ignore space on setLinkSAX Rss 解析忽略 setLink 上的空间
【发布时间】:2011-06-09 18:55:33
【问题描述】:

我已经制作了一个 RSS 阅读器,可以在小问题上使用一些帮助。当 rss XML 设置如下:

<link>http://www.grants.gov/search/search.do?mode=VIEW&amp;oppId=98616</link>

我的读者可以正常拉链接。

但我尝试阅读的一些提要设置如下:

<link>
http://www.ornl.gov/info/ornlreview/v44_1_11/article06.shtml
</link>

这导致我的读者错过了链接。

我已将问题缩小到:

    @Override
    public void characters(char[] ch, int start, int length)
        {
    // 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;
        }
    }

strCharacters 拉取当前行中的字符串,但带有空格的 RSS 只会拉取空格。关于如何让它跳过空白并在下一行拉链接的任何想法?

【问题讨论】:

    标签: android xml parsing sax


    【解决方案1】:
    1. 创建 documentBuilderFactory

      DocumentBuilderFactory 工厂= DocumentBuilderFactory.newInstance();

      1. 创建 DocumentBuilder

      DocumentBuilder 构建器=工厂。 newDocumentBuilder();

      1. 获取输入流 类加载器 cls=DomReader.class.getClassLoader(); InputStream is=cls.getResourceAsStream("xml文件");
        1. 解析xml文件,调用parse方法获取Document对象 在 DocumentBuilder 对象上。 文档 document=builder.parse(is);
        2. 使用文档对象遍历 dom 树。 萨克斯: 简单的 xml 解析。 它逐个节点解析 遍历是从上到下 内存使用率低 使用 sax 无法返回导航。

      //实现所需的处理程序 公共类 SaxParse 扩展 DefaultHandler{ } //saxParserFactory 的新实例 SAXParserFactory 工厂=SAXParserFactory.newInstance(); //SAX解析器的新实例 SAXParser saxparser=factory.newSAXParser(); //解析xml文档 SAXParser.parse(new File(要解析的文件), new SAXXMLParserImpl());

    【讨论】:

      【解决方案2】:

      您的解析器看起来很奇怪,请尝试这样做:

        private StringBuilder builder;   
      
        @Override
        public void startDocument() throws SAXException {
          super.startDocument();
          builder = new StringBuilder();
        }
      
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
          super.characters(ch, start, length);
          builder.append(ch, start, length);
        }
      
        public void endElement(String uri, String localName, String name) throws SAXException {
          if (currentState == state_link) {
            item.setLink(builder.toString().trim());
          }
          builder.setLength(0);
        }
      

      这样你就等到内容被完全使用,而不是仅仅阅读一行文本。

      【讨论】:

      • builder.append(ch, start, length);导致应用程序崩溃
      • 竖起大拇指现在解析更清晰..解决了我的问题非常感谢!
      • 没问题。是的,你真的不应该在字符中保存任何数据,只在 startTag(获取属性)和 endtag(保存内容)上。
      猜你喜欢
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多