2009-09-29 37 views
6

我创建了一个扩展了SaxParser DefaultHandler类的类。我的意图是将XML输入存储在一系列对象中,同时保留原始XML数据的数据完整性。在测试过程中,我注意到一些节点数据在输入时被任意截断。问题使用SaxParser解析XML文档 - 2047个字符限制?

例如:

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

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

我已覆盖抽象“的字符(字符[] CH,INT开始,INT长度)”的方法,以简单的抓斗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

回答

8

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

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

+0

感谢的末尾添加value = "";。看来这个建议是正确的。 – 2009-09-29 20:27:03

+0

正确答案。另一个考虑的可能是切换到使用Stax解析器(javax.xml.stream.XMLStreamReader),并启用“合并模式” - 这可以提供与SAX类似的高性能,但无需手动合并文本。 – StaxMan 2014-09-08 18:22:45

3

我花了整整两天寻找解决方案。

方法改变你的角色是:

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); 

} 

而且它做!

0

确保您在endElementMethod

public void endElement(String uri, String localName, String qName) throws SAXException 
{ 
    ... 
    value = ""; 
}