使用 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 个包含 &lt;temperature&gt;-125&lt;/temperature&gt; 的标签,但其中只有一个会产生 &lt;sensitivity&gt;5&lt;/sensitivity&gt; 的输出。其他标签准确生成&lt;sensitivity&gt;-125&lt;/sensitivity&gt;

我已经重写了抽象的“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 个字符限制?的主要内容,如果未能解决你的问题,请参考以下文章

Java SAXParser 解析无效的 xml [重复]

SAXParser 无法解析某些字符

Android:DOM vs SAX vs XMLPullParser 解析?

是否有一个 SaxParser 可以读取 json 并触发事件,所以它看起来像 xml

如何在 android 中使用 SAX Parser 为解析的 xml 文件设置 UTF-8

java - 如何将本地DTD文件的验证应用于java中的xml文件?