-1

SAX 解析器有这个方法

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

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

我从一开始就打印出来了,它似乎一直在随机跳跃数字。数量是如何确定的?

谢谢

4

1 回答 1

2

通常,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。

于 2013-10-13T22:41:39.270 回答