发布使用SaxParser解析XML文档 - 2047字符限制?

时间:2009-09-29 19:16:49

标签: java xml parsing

我创建了一个扩展SaxParser DefaultHandler类的类。我的目的是将XML输入存储在一系列对象中,同时保留原始XML数据的数据完整性。在测试期间,我注意到一些节点数据在输入时被任意截断。

例如:

Input: <temperature>-125</temperature>  Output: <sensitivity>5</sensitivity>
Input: <address>101_State</city>             Output: <address>te</address> 

为了使事情进一步复杂化,上述错误“随机”发生在相同XML标记的每100个实例中的1个中。这意味着输入XML文件包含大约100个包含<temperature>-125</temperature>的标记,但只有一个标记生成<sensitivity>5</sensitivity>的输出。其他标签准确生成<sensitivity>-125</sensitivity>

我已经覆盖了抽象的“characters(char [] ch,int start,int length)”方法来简单地抓取XML标签之间的字符内容:

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

            value = new String(ch, start, length);

            //debug
            System.out.println("'" + value + "'" + "start: " + start + "length: " + length);
        }

我的println语句为特定温度标签生成以下输出,导致错误输出:

> '-12'start: 2045length: 3 '5'start:
> 0length: 1

这告诉我,对于这个特定的xml元素,字符方法被调用两次。对于所有其他xml标记,它被调用一次。 secong行的“start”值表示char []字符正在此XML标记的中间重置。然后使用新的char []再次调用字符方法。

是否有人熟悉此问题?我想知道我是否达到了char []容量的极限。但是快速查询会使这种情况不太可能。我的char []似乎正在重置~2047个字符

谢谢,

LB

3 个答案:

答案 0 :(得分:8)

SAX Parser无需为characters callback method提供完整的数据块。解析器可以多次调用characters()方法,一次发送一块数据。

The resolution is to accumulate all the data in a buffer,直到下一次调用发生在另一个方法(非字符调用)上。

答案 1 :(得分:3)

我整整花了2天时间寻找解决方案。

将您的字符方法更改为:

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

  if(value == null)
    value = new String(ch, start, length);
  else
    value += new String(ch, start, length);

  //debug
  System.out.println("'" + value + "'" + "start: " + start + "length: " + length);

}

它完成了!!!

答案 2 :(得分:0)

确保在value = "";

的末尾添加endElementMethod
public void endElement( String uri, String localName, String qName ) throws SAXException 
{
    ...
    value = "";
}