0

我在我的 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”)。这里

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

在所有情况下,我都无法控制提要。我认为脚本确实会因特殊字符而窒息。如何确保 SAX 正确获取所有字符串?

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

提前致谢。

4

1 回答 1

5

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

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

你的代码很好地改编自许多 XML Parsing 教程之一(就像这里的这个)现在,这个教程很好,但是他们没有提到一些非常重要的东西......

注意这里的这部分......

    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在标签结束时将其实际(或提交)到您的结构中......(即 in 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附加功能会更好,因为这样会更有效率....

希望这是有道理的!如果它没有检查这个这里

于 2010-12-24T18:55:09.990 回答