为什么SaxParser随机失败?

时间:2010-12-24 18:28:31

标签: java android special-characters saxparser

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

                     // 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

在所有情况下,我都无法控制Feed。我认为脚本确实会阻塞特殊字符。如何确保SAX正确获取所有字符串?

如果有人知道这个问题的答案,你真的可以帮我解决很多问题:D

提前致谢。

1 个答案:

答案 0 :(得分:5)

这是来自Xerces的常见问题解答。

  

为什么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解析器调用{{1} } function is chunks ....

所以这里的诀窍是,当标签结束时,继续将值附加到字符串变量并将其实际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. } } 进行追加会更好,因为这会更有效....

希望它有意义!如果没有检查thishere