2009-09-29 65 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 = ""; 
}