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 解析器相似。它提供了類似的事件(開始元素和結(jié)束元素),但您需要使用 de >(parser.next()de > 提取它們。事件將作為數(shù)值代碼被發(fā)送,因此您可以使用一個簡單 case-switch。注意,解析并未像 SAX 解析那樣監(jiān)聽元素的結(jié)束,而是在開始處完成了大部分處理。在 清單 10 的代碼中,當(dāng)某個元素開始時,您可以調(diào)用 de >parser.nextText()de > 從 XML 文檔中提取所有字符數(shù)據(jù)。還需注意,您設(shè)置了一個標記(布爾變量 de >donede >)來確定何時到達感興趣內(nèi)容的結(jié)束部分。這允許您提早停止讀取 XML 文檔,因為您知道代碼將不會關(guān)心文檔的其余部分。這有時非常實用,特別是當(dāng)您只需要訪問一小部分 XML 文檔時。通過盡快停止解析,您可以極大地減少解析時間。這種優(yōu)化對于連接速度較慢的移動設(shè)備尤為重要。pull 解析器可以提供一些性能優(yōu)勢以及易用性。它還可以用于編寫 XML。
目前為止,我一直專注于通過 Internet 解析 XML。但是,有時您的應(yīng)用程序可能需要將 XML 發(fā)送到遠程服務(wù)器。顯然,您可以只使用一個 de >StringBuilderde > 來創(chuàng)建 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 > 包的一部分。它沒有提取事件,而是將它們推出到數(shù)據(jù)流或編寫程序中。在本例中,它僅僅將事件推送到了一個 de >java.io.StringWriterde > 實例中。它提供了一個直觀的 API,通過各種方法開始和結(jié)束文檔、處理元素以及添加文本或?qū)傩?。這是 de >StringBuilderde > 的一種出色的替換方案,因為它可以更加輕松地確保您的 XML 具有良好結(jié)構(gòu)。