XmlPullParser (XPP) 是輕量級 XML 處理庫,XmlSerializer 用於序列化寫入 XML,適合 Android、Java ME 及對依賴體積敏感的場景。
<dependency>
<groupId>xmlpull</groupId>
<artifactId>xmlpull</artifactId>
<version>1.1.3.1</version>
</dependency>
<!-- 或 xpp3 -->
<dependency>
<groupId>org.xmlpull.mxp1</groupId>
<artifactId>mxp1</artifactId>
<version>1.1.4.5</version>
</dependency>
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import java.io.FileOutputStream;
import java.io.IOException;
public class PullProduceDocument {
public static void main(String[] args) throws Exception {
// 1. 獲取工廠與序列化器
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlSerializer serializer = factory.newSerializer();
// 2. 設置輸出目標(文件 + 編碼)
serializer.setOutput(new FileOutputStream("src/books.xml"), "UTF-8");
// 3. 寫入文檔頭
serializer.startDocument("UTF-8", true); // standalone=true
// 4. 根元素
serializer.startTag(null, "books");
// 5. 循環生成 5 本書
for (int i = 0; i < 5; i++) {
serializer.startTag(null, "book");
serializer.attribute(null, "id", "book" + (i + 1)); // 屬性
serializer.startTag(null, "name");
serializer.text("三國演義"); // 文本內容
serializer.endTag(null, "name");
serializer.startTag(null, "author");
serializer.text("羅貫中");
serializer.endTag(null, "author");
serializer.startTag(null, "price");
serializer.text("30$");
serializer.endTag(null, "price");
serializer.endTag(null, "book");
}
// 6. 關閉根元素與文檔
serializer.endTag(null, "books");
serializer.endDocument();
System.out.println("XML 生成完成:src/books.xml");
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<books>
<book id="book1">
<name>三國演義</name>
<author>羅貫中</author>
<price>30$</price>
</book>
<book id="book2">
<name>三國演義</name>
<author>羅貫中</author>
<price>30$</price>
</book>
...
</books>
| 方法 | 用途 | 參數說明 |
|---|---|---|
setOutput(OutputStream, encoding) | 設置輸出流與編碼 | 也支持 Writer |
startDocument(encoding, standalone) | 寫入 XML 聲明 | standalone=true 表示無外部 DTD 依賴 |
startTag(ns, name) | 開始元素 | ns=null 表示無命名空間 |
attribute(ns, name, value) | 寫入屬性 | 必須在 startTag 之後、endTag 之前調用 |
text(String) | 寫入文本內容 | 自動轉義 < > & ' " |
endTag(ns, name) | 結束元素 | 需與 startTag 配對 |
endDocument() | 結束文檔,刷新緩衝區 | 必須調用,否則輸出不全 |
cdsect(String) | 寫入 CDATA 區塊 | 大量文本/含特殊字符時使用 |
comment(String) | 寫入註釋 | <!-- comment --> |
setPrefix(prefix, ns) | 設置命名空間前綴 | 生成 <ns:tag> |
public void writeBooks(List books, OutputStream out) throws Exception {
XmlSerializer serializer = XmlPullParserFactory.newInstance().newSerializer();
serializer.setOutput(out, "UTF-8");
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "books");
for (Book b : books) {
serializer.startTag(null, "book");
serializer.attribute(null, "id", b.getId());
writeSimpleTag(serializer, "name", b.getName());
writeSimpleTag(serializer, "author", b.getAuthor());
writeSimpleTag(serializer, "price", b.getPrice());
serializer.endTag(null, "book");
}
serializer.endTag(null, "books");
serializer.endDocument();
}
private void writeSimpleTag(XmlSerializer s, String tag, String value) throws IOException {
s.startTag(null, tag);
s.text(value);
s.endTag(null, tag);
}
| 特性 | XmlSerializer (XPP) | DOM (W3C) | JAXB |
|---|---|---|---|
| 依賴體積 | ~100KB (xpp3) | JDK 內置 | ~1MB (jaxb-impl) |
| 內存模式 | 流式寫入,不佔內存 | 全量樹,佔內存大 | 對象樹,佔內存中等 |
| 編程風格 | 事件驅動/流式 | 樹操作 | 註解映射/對象綁定 |
| 適用場景 | 大文件生成、Android、嵌入式 | 小文件、需隨機訪問修改 | 對象序列化、配置文件、WebService |
XmlSerializer 以極小的體積、流式寫入特性,成為生成大型 XML 文件、Android 開發、資源受限環境的首選方案。