Java執行個體:SAX characters(char ch[],int start,int length)

來源:互聯網
上載者:User

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()

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.