XML 結構如下:
<root>
<tag1>data</tag1>
<tag2>
<div>data1</div><div>data2</div>
</tag2>
</root>
只能解析 tag1,tag2 及其子 div 全部取不到值。
SAX 為流式解析,characters() 可能被多次呼叫,必須在 startElement 建立 StringBuffer,在 characters 累加,最後在 endElement 取值。原碼未對 div 建立獨立緩衝區,導致資料丟失。
public class MyHandler extends DefaultHandler {
private StringBuffer currentBuffer = new StringBuffer();
private String currentTag = "";
@Override
public void startElement(String uri, String localName, String qName, Attributes attrs) {
currentTag = localName;
// 每個關心的標籤都重置緩衝區
if ("tag1".equals(localName) || "tag2".equals(localName) || "div".equals(localName)) {
currentBuffer.setLength(0);
}
}
@Override
public void characters(char[] ch, int start, int length) {
if ("tag1".equals(currentTag) || "tag2".equals(currentTag) || "div".equals(currentTag)) {
currentBuffer.append(ch, start, length);
}
}
@Override
public void endElement(String uri, String localName, String qName) {
String value = currentBuffer.toString().trim();
if ("tag1".equals(localName)) {
Log.d("SAX", "tag1=" + value);
} else if ("tag2".equals(localName)) {
Log.d("SAX", "tag2=" + value); // 會包含兩個 div 的文字
} else if ("div".equals(localName)) {
Log.d("SAX", "div=" + value); // 單獨每個 div
}
}
}
div,可在 startElement 記錄層級或用 List<String> 收集。XmlPullParser(Android 推薦)或 DOM(小檔案)。localName 忽略前綴。依循「start 建 buffer → chars 累加 → end 取值」三步驟,巢狀標籤解析不再遺漏。