【问题标题】:SAX parser: public void characters(char ch[], int start, int length). Value "start" increments too muchSAX 解析器:public void characters(char ch[], int start, int length)。值“开始”增加太多
【发布时间】:2013-10-13 16:33:18
【问题描述】:

SAX 解析器有这个方法

characters(char ch[], int start, int length)

据我所知,它会在标签中获取字符串。我意识到,随着 SAX 解析器继续在大型 XML 文件上运行,int start 变得越来越大,以至于超过了最大 int 值。

我打印了 start,它似乎一直在随机跳跃数字。数量是如何确定的?

谢谢

【问题讨论】:

  • 您能提供语言和库的详细信息吗?这可能是特定实现中的错误。
  • 产生问题的 xml 链接也很有用。在快速实验中,我没有看到任何证据表明 MacOS 上的 Java 1.6.0_51 中的标准库会发生这种情况。
  • “如此之多以至于超过了最大 int 值”——当然,这是不可能的。你能拿出一些证据吗?

标签: xml int character sax increment


【解决方案1】:

通常,SAX 解析器会一次读取一个缓冲区满的数据。在给定点,缓冲区可能包含类似这样的内容

="a" foo="bar"><b x="1">some text</b></a><c

现在,当解析器报告此缓冲区中的文本节点时,它可能会调用您的 ContentHander,提供一个包含整个缓冲区的 char[] 数组,start=24,长度=9。或者,如果它愿意,它可能会提供与一系列调用相同的数据。如果文本节点恰好跨越两个缓冲区,如下所示:

="a" foo="bar"><b x="1">some 
 text</b></a>

那么第一个调用可能会为第一个缓冲区提供 start=24 长度=4,第二个调用将为第二个缓冲区提供 start=0 长度=5。

这个想法是解析器不必承担将数据移出原始缓冲区并将其组装成连续字符串的成本。从理论上讲,这会带来性能优势;实际上,大多数 SAX 应用程序都希望将文本节点的内容收集到一个连续的字符串中,因此复制成本只是转移到了应用程序中。

真的,您不应该关心 start 和 length 的值是什么,或者 char[] 数组中超出这些界限的值是什么。只需将这些范围内的数据复制到 StringBuilder。

【讨论】:

    猜你喜欢
    • 2014-03-03
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多