Android xml讀寫(八)
java代碼:
- case XmlPullParser.END_TAG:
- name = parser.getName();
- if (name.equalsIgnoreCase(ITEM) &&
- currentMessage != null){
- messages.add(currentMessage);
- } else if (name.equalsIgnoreCase(CHANNEL)){
- done = true;
- }
- break;
- }
- eventType = parser.next();
- }
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- return messages;
- }
- }
pull 解析器的運行方式與 SAX 解析器相似。它提供了類似的事件(開始元素和結束元素),但您需要使用 de >(parser.next()de > 提取它們。事件將作為數值代碼被發送,因此您可以使用一個簡單 case-switch。注意,解析并未像 SAX 解析那樣監聽元素的結束,而是在開始處完成了大部分處理。在 清單 10 的代碼中,當某個元素開始時,您可以調用 de >parser.nextText()de > 從 XML 文檔中提取所有字符數據。還需注意,您設置了一個標記(布爾變量 de >donede >)來確定何時到達感興趣內容的結束部分。這允許您提早停止讀取 XML 文檔,因為您知道代碼將不會關心文檔的其余部分。這有時非常實用,特別是當您只需要訪問一小部分 XML 文檔時。通過盡快停止解析,您可以極大地減少解析時間。這種優化對于連接速度較慢的移動設備尤為重要。pull 解析器可以提供一些性能優勢以及易用性。它還可以用于編寫 XML。
目前為止,我一直專注于通過 Internet 解析 XML。但是,有時您的應用程序可能需要將 XML 發送到遠程服務器。顯然,您可以只使用一個 de >StringBuilderde > 來創建 XML 字符串。另一種備選方法來自 清單 11 中的 Pull 解析器。
清單 11. 使用 pull 解析器編寫 XML
- private String writeXml(List< Message > messages){
- XmlSerializer serializer = Xml.newSerializer();
- StringWriter writer = new StringWriter();
- try {
- serializer.setOutput(writer);
- serializer.startDocument("UTF-8", true);
- serializer.startTag("", "messages");
- serializer.attribute("", "number", String.valueOf(messages.size()));
- for (Message msg: messages){
- serializer.startTag("", "message");
- serializer.attribute("", "date", msg.getDate());
- serializer.startTag("", "title");
- serializer.text(msg.getTitle());
- serializer.endTag("", "title");
- serializer.startTag("", "url");
- serializer.text(msg.getLink().toExternalForm());
- serializer.endTag("", "url");
- serializer.startTag("", "body");
- serializer.text(msg.getDescription());
- serializer.endTag("", "body");
- serializer.endTag("", "message");
- }
- serializer.endTag("", "messages");
- serializer.endDocument();
- return writer.toString();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
de >XmlSerializerde > 類是 前一部分 所使用的 de >XmlPullParserde > 包的一部分。它沒有提取事件,而是將它們推出到數據流或編寫程序中。在本例中,它僅僅將事件推送到了一個 de >java.io.StringWriterde > 實例中。它提供了一個直觀的 API,通過各種方法開始和結束文檔、處理元素以及添加文本或屬性。這是 de >StringBuilderde > 的一種出色的替換方案,因為它可以更加輕松地確保您的 XML 具有良好結構。