应用 Castor 把 XML 转换成相应的 JavaBean(一)

之前有一篇用例子演示了 应用 JAXB 把 XML 转换成相应的 JavaBean,现在来看另一款 XML Data Binding 工具 Castor 怎么把 XML 映射成 JavaBean  的,相对于 JAXB 规范性的东西,Castor 的官方网站上关于 Castor 的使用文档我觉得要多些。作为一个 XML Data Binding  工具,Castor 同样提供了 Marshaller 和 Unmarshaller 的功能,它不依赖于注解,还是采用映射文件的方式,像 Hibernate 那样的映射文件。


从 Castor 的官方网站 http://www.castor.org/ 看到它的外围生态系统还是不错的,有 JDO、Maven、Spring、Eclipse Plugin 的支持,也有众多组件用到了它。和其他类似工具一样,Castor 也提供了 XML、Schema 生成 Class 类的功能,但照例这里还是看看先有类的情况,怎么从 XML 中获取相应值。

通常使用 Castor 从 XML 得到 JavaBean 需要一个映射文件,要是 JavaBean 的属性和 XML 中的节点名足够齐整规范就可以省去映射文件,先看不用映射文件的例子:

1. 引入 castor 相关的 jar 包,如果你是用 maven 来管理你的项目依赖(很多都是了吧),可以在 pom.xml 中加入下面依赖:
1<dependency>
2    <groupId>org.codehaus.castor</groupId>
3    <artifactId>castor-xml</artifactId>
4    <version>1.3.1</version>
5</dependency>

实际上引入了两个 jar 包,分别是 castor-core-1.3.1.jar 和 castor-xml-1.3.1.jar,非 maven 项目就直接下载或是 ant+ivy 也可以自动管理依赖。

2. Person.java:
 1package cc.unmi.castor;
 2
 3import java.util.Date;
 4
 5/**
 6 * @author Unmi Qiu
 7 * CreateTime: Apr 23, 2011
 8 */
 9public class Person {
10    private String name;
11    private Date birthDay;
12
13    public String getName() {
14        return name;
15    }
16    public void setName(String name) {
17        this.name = name;
18    }
19    public Date getBirthDay() {
20        return birthDay;
21    }
22    public void setBirthDay(Date birthDay) {
23        this.birthDay = birthDay;
24    }  
25}

3. person.xml 文件:
1<?xml version="1.0" encoding="UTF-8"?>
2<person>
3    <name>Ryan 'Mad Dog' Madden</name>
4    <birth-day>2011-04-15T00:00:00.000+08:00</birth-day>
5</person>

这里标签名与属性名是相对应的,对于驼峰格式的属性名标签映射为横杠分割形式,如 birthDay 变是 birth-day。这里时间也是用的标准字符串,否则需要加个DateHandler 来转换。

4. Client.java  客户端调用代码:
 1package cc.unmi.castor;
 2
 3import java.io.InputStream;
 4
 5import org.exolab.castor.xml.MarshalException;
 6import org.exolab.castor.xml.Unmarshaller;
 7import org.exolab.castor.xml.ValidationException;
 8import org.xml.sax.InputSource;
 9
10public class Client {
11
12    public static void main(String[] args) throws MarshalException, ValidationException {
13        InputStream xmlInputStream = ClassLoader.getSystemResourceAsStream("person.xml");
14        Unmarshaller unmarshaller = new Unmarshaller(Person.class);
15        InputSource inputSource = new InputSource(xmlInputStream);
16        Person person = (Person)unmarshaller.unmarshal(inputSource);
17        System.out.println(person.getBirthDay());
18    }
19}

控制台输出为:Fri Apr 15 00:00:00 CST 2011,说明属性能正确获得,成功从 XML 转换得到 JavaBean。

几点说明:

1)  Java 对象是通过默认构造方法创建的,所以必须提供默认构造函数,属性是通过 setter 方法设置的
2)  引入了 castor 的包,应该把日志输出组件配置上,如 commons-logging 或 slf4j,如此你就可以看到日志中的详细信息
3)  Castor 的 unmarshal 未提供泛型实现,虽然提供了被转换后的 JavaBean 的 Class,但 unmarshal 返回的仍然是 Object,你需要转型,或是包装出一个泛型版本来
4) Castor 中可对 castor.core.properties 和 castor.xml.properties 进行定制,默认配置文件分别为 /org/castor/core/castor.core.properties 和 /org/castor/xml/castor.xml.properties。


本篇就列这一个例子吧,关于稍复杂一点的映射还是再开一篇章吧,那请见下一篇:应用 Castor 把 XML 转换成相应的 JavaBean(二)

参考:1. http://www.castor.org/xml-mapping.html
             2. http://castor.org/spring-xml-intro.html
             3. http://www.castor.org/xml-framework.html
             4. http://www.castor.org/reference/html/XML%20data%20binding.html 永久链接 https://yanbin.blog/castor-xml-to-javabean-1/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。