Java 原生 DOM/SAX/StAX API 複雜冗長;JAXB 配置繁瑣;Apache Betwixt Bug 多、維護停滯。Simple Framework 以 Annotation 驅動、零配置、極簡 API 解決 XML ⇄ Java 物件雙向轉換,官網:simple.sourceforge.net。
核心類別:org.simpleframework.xml.Serializer、Persister。常用註解:
| 註解 | 用途 |
|---|---|
@Root | 標記根元素,可指定 name |
@Element | 子元素,可設 required、name、type |
@Attribute | XML 屬性 |
@ElementList | 集合/陣列,支援 inline、entry、type |
@ElementMap | Map 結構 |
@Root(name = "example")
public class Example {
@Element(name = "text") private String text;
@Attribute(name = "index") private int index;
@Element(name = "flag") private boolean flag;
@Element(name = "num", required = false) private Integer num;
@ElementList(name = "slist", required = false, inline = true)
private List<String> slist = new ArrayList<>();
public Example() {} // 必須有無參建構子
public Example(String text, int index) { this.text = text; this.index = index; }
// getter/setter 略
}
// 序列化/反序列化
Serializer serializer = new Persister();
Example ex = new Example("Example message", 123);
File out = new File("outxml/example.xml");
serializer.write(ex, out);
Example in = serializer.read(Example.class, out);
System.out.println(in.getText()); // Example message
輸出 XML:
<example index="123">
<text>Example message</text>
<flag>false</flag>
<slist/>
</example>
@Root public class Customer {
@Attribute(required = true) private Long id;
@Element(required = true) private String name;
@Element(required = false) private Address address;
@ElementList(required = false, type = Order.class, inline = true)
private List<Order> orderList = new ArrayList<>();
// 建構子、getter/setter 略
}
@Root public class Address {
@Element(required = true) private String code;
@Element private String street;
@Element private boolean isopen;
// ...
}
@Root public class Order {
@Attribute(required = true) private Long id;
@Element(required = true) private Date cdate;
@ElementList(required = false, type = Item.class, inline = true)
private List<Item> itemList = new ArrayList<>();
// ...
}
@Root public class Item {
@Attribute private Long id;
@Element(required = true) private int num;
@Element(required = false) private BigDecimal price;
// ...
}
測試碼:
Customer c = new Customer(111L, "張三");
c.setAddress(new Address("450000", "瑞達路XX#", true));
Order o1 = new Order(1L, new Date());
Order o2 = new Order(2L, new Date());
o1.getItemList().add(new Item(1, 11L));
o2.getItemList().add(new Item(2, 21L));
c.getOrderList().add(o1); c.getOrderList().add(o2);
Serializer serializer = new Persister();
serializer.write(c, new File("outxml/customer.xml"));
Customer in = serializer.read(Customer.class, new File("outxml/customer.xml"));
System.out.println(in.getName()); // 張三
Simple 確實名副其然:API 直覺、文件清晰、功能完整(集合、巢狀、屬性、驗證),是目前 Java XML 映射的最佳輕量選擇之一。