【问题标题】:Issue Parsing XML Document using SaxParser - 2047 character limit?使用 SaxParser 解析 XML 文档的问题 - 2047 个字符限制?
【发布时间】: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 个字符

谢谢,

磅数

【问题讨论】:

    标签: java xml parsing


    【解决方案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 = "";
      }
      

      【讨论】:

        猜你喜欢
        • 2013-03-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 2012-06-01
        • 1970-01-01
        • 2014-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多