我创建了一个扩展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
答案 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 = "";
}