Java實例:SAX characters(char ch[],int start,int length)

SAX characters(char ch[],int start,int length) 並不一定就能完整的表示 元素的值. 如果xml文檔交長, 有可能一個元素的值會被分兩次讀入,所以如果只適用上面的方法去獲得元素的值,很可能得到的不完整的數據.
SAX可能容易忽略characters這個回調方法的一點細節,characters會在startElement和endElement之間調用多次,不能保證一次會返回整個文本塊,所以必須等待endElement的時候纔可以認爲這個文本結點結束。
1.案例:
<line>i love   you, why i have no girlfriend</line>
在用SAX處理的過程中,DefaultHandler中的處理結果可能是這樣的:
startElement : line
characters: i love you,why 
characters:i have no girlfriend
endElement:line

2.原因:
SAX parser 分塊讀取流, 默認爲一次讀取2K字節. (ch 裏面不僅包含元素的值信息,其實它是整個xml文檔的一個部分,也就是說,分析器每次從文檔中讀取2K字節,放到這個數組中,然後通過start和length來劃分出屬於value的部分.這樣的話,不能保證最後一個元素的值是完全被包含在這個ch中的).所以我們還是要進行一些額外的操作才能通過 characters(char ch[],int start,int length)獲得完整的element value.       Parser每次讀取2K字節去填充ch. 填充順序是從開頭到結尾來覆蓋原有的值, 所以在最後一次讀取文檔的時候,可能剩餘部分不足2K,所以就會出現ch 中,前半部分是 文檔的末尾部分, 而ch後半部分還有多餘的信息,這個是倒數第二個ch中未被覆蓋掉的部分。
3.解決辦法方法:
所以你應該使用StringBuilder緩存,
在startElement的時候調用sb.setLength(0);
每次characters時調用sb.append(ch, start, length);
在endElement的時候才調用String str = sb.toString()



發佈了23 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章