我在Android应用程序中使用SAX解析器来一次读取一些提要。该脚本执行如下。

                     // Begin FeedLezer
                    try {

                        /** Handling XML **/
                        SAXParserFactory spf = SAXParserFactory.newInstance();
                        SAXParser sp = spf.newSAXParser();
                        XMLReader xr = sp.getXMLReader();

                        /** Send URL to parse XML Tags **/
                        URL sourceUrl = new URL(
                            BronFeeds[i]);

                        /** Create handler to handle XML Tags ( extends DefaultHandler ) **/
                        Feed_XMLHandler myXMLHandler = new Feed_XMLHandler();
                        xr.setContentHandler(myXMLHandler);
                        xr.parse(new InputSource(sourceUrl.openStream()));

                    } catch (Exception e) {
                        System.out.println("XML Pasing Excpetion = " + e);
                    }
                     sitesList = Feed_XMLHandler.sitesList;

                    String titels = sitesList.getMergedTitles();


这是Feed_XMLHandler.javaFeed_XMLList.java,我基本上都是从网络上获取的。

但是,此代码有时会失败。我将展示一些示例。

http://imm.io/media/2I/2IAs.jpg
这里进展顺利。它甚至可以识别并显示撇号。即使单击打开的文章,几乎所有文本都会显示出来,所以一切都很好。源提要在这里。我无法控制供稿。

http://imm.io/media/2I/2IB1.jpg在这里,进展不太顺利。它的确显示ï,但在撇号时会感到窒息(在Waarom之后应该是'NORAD')。 Here

http://imm.io/media/2I/2IBQ.jpg这是最糟糕的一个。如您所见,标题仅显示撇号,而标题应该是'blablabla'。此外,文本在行中间结束,引号中没有任何特殊字符。 The feed is here

在所有情况下,我都无法控制该供稿。我认为该脚本确实会扼杀特殊字符。如何确保SAX正确提取所有字符串?

如果有人知道答案,那么您真的可以帮我很多

提前致谢。

最佳答案

这是从Xerces的FAQ中获得的。


  为什么SAX解析器会丢失一些
  字符数据或为什么是数据
  分成几块?如果你
  阅读SAX文档,您将
  发现SAX可以连续发送
  将文字视为对字符的多次调用,
  由于与解析器有关的原因
  效率和输入缓冲。它是
  程序员的责任
  适当地处理,例如通过
  累积文本直到下一个
  非字符事件。


您的代码非常适合许多XML解析教程之一(如此处的this)。现在,该教程非常出色,但都没有提及非常重要的内容...

在这里注意这部分...

    public void characters(char[] ch, int start, int length)
            throws SAXException
    {
              if(in_ThisTag){
                     myobj.setName(new String(ch,start,length))
              }
    }


我敢打赌,此时您正在检查布尔值以标记您位于哪个标签下,然后在您制作的某种class中设置值?或类似的东西....

但是问题是,SAX解析器(已缓冲)并不一定会一次性让您获得标签之间的所有字符。...说一下<tag> Lorem Ipsum...really long sentence...</tag>是否使您的SAX解析器调用characters函数是块... 。

因此,这里的窍门是继续将值附加到字符串变量,并在标记结束时将其实际set(或提交)到您的结构中(例如,在endElement中)



@Override
public void endElement(String uri, String localName, String qName)
        throws SAXException {

    currentElement = false;

    /** set value */
    if (localName.equalsIgnoreCase("tag"))
            {
        sitesList.setName(currentValue);
                    currentValue = ""; //reset the currentValue
            }

}

@Override
public void characters(char[] ch, int start, int length)
        throws SAXException {

    if (in_Tag) {
        currentValue += new String(ch, start, length); //keep appending string, don't set it right here....maybe there's more to come.
    }

}


另外,最好使用StringBuilder进行附加,因为这样会更有效。

希望有道理!如果没有检查thishere

关于java - 为什么SaxParser随机失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4527782/

10-10 06:45