注册
 找回密码
 注册
江西广告网
查看: 452|回复: 0
打印 上一主题 下一主题

Simple---强大的XOM工具

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2009-3-17 08:14:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
在Java应用中做XML与Java对象的双向转换往往是件费力不讨好的事情,如果一个应用的核心数据交换是以XML为核心的,做这种转换往往风险很大,真正复杂的地方其实是XML到Java的转换。 本人也算一个Java的狂热分子,曾经对SUN提供的类库深信不疑,对Apache提供的组件礼顶膜拜,结果狠狠被SUN和Apache恶心了一把——SUN的XML API像肿瘤一样畸形发展,尤其到了J2EE规范部分,复杂的令人望而却步。Apache提供了几个XML组建工具,与Java互转的有Betwixt2,结果bug多多,像漏气的车胎,你无法依赖它能走多远! 郁闷之极,已经到了山穷水尽的地步,眼下项目就尾声了,总不能退回到石器时代重拾DOM4j吧!到open-open上找找,终于柳暗花明,Simple——强大的XOM工具,横扫我心中的疑云,Simple! 经过一些测试,Simple果然不负众望,以前遇到的问题轻松搞定! 一个多小时时间就可以熟悉了里面的API和开发文档了。有空我写个教程上来。 官方主页:http://simple.sourceforge.net/home.php 建议在看之前,花10分钟看看开发指南,基本上就看了八九不离十了:http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php 下面给两个例子,第一个简单的,来自开发指南: package test1; import org.simpleframework.xml.*; import org.simpleframework.xml.core.Persister; import java.io.File; import java.util.List; import java.util.ArrayList; @Root public class Example { @Element private String text; @Attribute private int index; @Element() private boolean flag; @Element(required = false) private Integer num; @ElementList(required = false) private List<String> slist = new ArrayList<String>(); public Example() { super(); } public Example(String text, int index) { this.text = text; this.index = index; // slist.add("sdf"); } public String getMessage() { return text; } public int getId() { return index; } public static void main(String[] args) throws Exception { Serializer serializer = new Persister(); Example example = new Example("Example message", 123); File result = new File("outxml/example.xml"); serializer.write(example, result); Example _obj = serializer.read(Example.class, result); System.out.println(_obj.getMessage()); } } 输入的文件内容: <example index="123"> <text>Example message</text> <flag>false</flag> <slist class="java.util.ArrayList"/> </example> 控制太输出信息: Example message Process finished with exit code 0 [1] [2] 第二个,我自己定制的,仅仅省略了getter/setter: @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) private List<Order> orderList = new ArrayList<Order>(0); public Customer() { } public Customer(Long id, String name) { this.id = id; this.name = name; } @Root public class Address { @Element(required = true) private String code; @Element private String street; @Element private boolean isopen; public Address() { } public Address(String code, String street, boolean isopen) { this.code = code; this.street = street; this.isopen = isopen; } @Root public class Order { @Attribute(required = true) private Long id; @Element(required = true) private Date cdate; @ElementList(required = false, type = Item.class) private List<Item> itemList = new ArrayList<Item>(0); public Order() { } public Order(Long id, Date cdate) { this.id = id; this.cdate = cdate; } @Root public class Item { @Attribute private Long id; @Element(required = true) private int num; @Element(required = false) private BigDecimal price; public Item() { } public Item(int num, Long id) { this.num = num; this.id = id; } package test; import org.simpleframework.xml.Serializer; import org.simpleframework.xml.core.Persister; import java.util.Date; import java.io.File; /** * Created by IntelliJ IDEA. * * @author leizhimin 2008-12-29 22:05:16 */ public class TestSimple { public static void main(String[] args) throws Exception { Customer customer = new Customer(111L, "张三"); Order order1 = new Order(1L, new Date()); Order order2 = new Order(2L, new Date()); Item item11 = new Item(1, 11L); Item item21 = new Item(2, 21L); Address address = new Address("450000", "瑞达路XX#", true); customer.setAddress(address); customer.getOrderList().add(order1); customer.getOrderList().add(order2); order1.getItemList().add(item11); order2.getItemList().add(item21); Serializer serializer = new Persister(); File result = new File("outxml/customer.xml"); serializer.write(customer, result); Customer _obj = serializer.read(Customer.class, result); System.out.println(_obj.getName()); System.out.println(_obj.getOrderList().get(0).getCdate()); } } 生成的文件: <customer id="111"> <name>张三</name> <address> <code>450000</code> <street>瑞达路XX#</street> <isopen>true</isopen> </address> <orderList class="java.util.ArrayList"> <order id="1"> <cdate>2008-12-29 23:36:36.390 CST</cdate> <itemList class="java.util.ArrayList"> <item id="11"> <num>1</num> </item> </itemList> </order> <order id="2"> <cdate>2008-12-29 23:36:36.390 CST</cdate> <itemList class="java.util.ArrayList"> <item id="21"> <num>2</num> </item> </itemList> </order> </orderList> </customer> 控制台输出的内容: 张三 Mon Dec 29 23:36:36 CST 2008 Process finished with exit code 0 总结下: Simple的确简单,好用,是一个优良的XML Object Mapping转换工具,简单到没有必要对API进行苦心积虑的研究和摸索。 Simple可以灵活定制XML的格式、元素名、命名空间、集合、数组、复杂对象等等支持都很好,并且Simple还可以验证XML是否可以正确转换为对象。 Simple要求每个Bean必须提供一个默认的构造方法,这是个开发参考中没有明确提出的要求,我经过大量测试发现的。否则,你再从XML转Java的时候会抛出一个莫名其妙的异常。 上一页 [1] [2]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表