使用 SaxParser 解析 XML 文档的问题 - 2047 个字符限制?
Posted
技术标签:
【中文标题】使用 SaxParser 解析 XML 文档的问题 - 2047 个字符限制?【英文标题】:Issue Parsing XML Document using SaxParser - 2047 character limit? 【发布时间】:2010-12-02 10:32:09 【问题描述】:我创建了一个扩展 SaxParser DefaultHandler 类的类。我的意图是将 XML 输入存储在一系列对象中,同时保持原始 XML 数据的数据完整性。在测试期间,我注意到一些节点数据在输入时被任意截断。
例如:
Input: <temperature>-125</temperature> Output: <sensitivity>5</sensitivity>
Input: <address>101_State</city> Output: <address>te</address>
更复杂的是,上述错误“随机”发生在每 100 个相同 XML 标记实例中的 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 行的“开始”值对我来说意味着 char[] 字符在这个 XML 标记的中间被重置。并且使用新的 char [] 再次调用字符方法。
有人熟悉这个问题吗?我想知道我是否达到了 char [] 容量的极限。但是快速查询使这不太可能。我的 char [] 似乎正在重置为 ~ 2047 个字符
谢谢,
磅数
【问题讨论】:
【参考方案1】:characters callback method 不需要由 SAX 解析器提供完整的数据块。解析器可以多次调用 characters() 方法,一次发送一大块数据。
The resolution is to accumulate all the data in a buffer,直到下一次调用发生在另一个方法上(非字符调用)。
【讨论】:
正确答案。另一种需要考虑的可能性是切换到使用 Stax 解析器 (javax.xml.stream.XMLStreamReader),并启用“合并模式”——这提供了类似于 SAX 的高性能,但无需手动合并文本。【参考方案2】:我花了整整 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);
完成了!!!
【讨论】:
【参考方案3】:确保在endElementMethod
末尾添加value = "";
public void endElement( String uri, String localName, String qName ) throws SAXException
...
value = "";
【讨论】:
以上是关于使用 SaxParser 解析 XML 文档的问题 - 2047 个字符限制?的主要内容,如果未能解决你的问题,请参考以下文章
Android:DOM vs SAX vs XMLPullParser 解析?
是否有一个 SaxParser 可以读取 json 并触发事件,所以它看起来像 xml