首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android SAX 解析:正確從巢狀 div 標籤取值

     編輯:程式設計綜合問答

問題場景

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
        }
    }
}

關鍵要點

  1. 每個目標標籤都要在 startElement 清空緩衝區,避免跨標籤汙染。
  2. characters 只管累加,不做判斷邏輯。
  3. endElement 才輸出,此時完整文字已就緒。
  4. 若需區分同層多個 div,可在 startElement 記錄層級或用 List<String> 收集。

進階建議

  • 大量資料改用 XmlPullParser(Android 推薦)或 DOM(小檔案)。
  • 命名空間處理:用 localName 忽略前綴。

依循「start 建 buffer → chars 累加 → end 取值」三步驟,巢狀標籤解析不再遺漏。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved