Castor XML是一个数据绑定框架,用于把Java 对象编组到XML或从XML解组数据生成Java 对象。与DOM和SAX不同的是,这两者的关注点是XML文档的结构,而Castor XML关注的XML文档里的数据。Castor XML 处理数据绑定有三种方式:内省模式、映射文件、类描述器模式。
内省模式是最简单的方式。Castor XML 使用Java 的反射机制和默认的命名规则来处理XML文档里属性、元素与Java 类、属性之间的绑定关系。
内省模式主要使用org.exolab.castor.xml.Marshaller和 org.exolab.castor.xml.Unmarshaller的静态方法来编组和解组。
下面是一个要编组和解组的Java 类:
下面是一个编组到XML的代码:
编组生成的XML文档:
从生成的XML文档解组,生成Java 对象的代码:
结果输出:
CD title: Sessions for Robert J
CD artist: Eric Clapton
Track: Little Queen of Spades
Track: Terraplane Blues
内省模式的缺点:
1、Java 类及属性与XML文档的元素、属性之间的绑定的命名规则是由Castor XML框架定义的,这是可能改变的,如果改变了,已有代码可能不能运行。
2、如果XML文档的元素、属性名是我们无法控制的,则无法解决。
3、无法解决一个Java 类映射到多个平台的XML文档(每个平台的XML文档都不同)的情况。
内省模式是最简单的方式。Castor XML 使用Java 的反射机制和默认的命名规则来处理XML文档里属性、元素与Java 类、属性之间的绑定关系。
内省模式主要使用org.exolab.castor.xml.Marshaller和 org.exolab.castor.xml.Unmarshaller的静态方法来编组和解组。
下面是一个要编组和解组的Java 类:
@SuppressWarnings("unchecked")
public class CD {
private String name = null;
private String artist = null;
private List tracks = null;
public CD() {
super();
}
public CD(String name, String artist) {
super();
this.name = name;
this.artist = artist;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getArtist() {
return artist;
}
public void setTracks(List tracks) {
this.tracks = tracks;
}
public List getTracks() {
return tracks;
}
public void addTrack(String trackName) {
if (tracks == null) {
tracks = new ArrayList();
}
tracks.add(trackName);
}
}
下面是一个编组到XML的代码:
public class IntrospectMarshaller {
public static void main(String[] args) {
try {
CD sessions = new CD("Sessions for Robert J", "Eric Clapton");
sessions.addTrack("Little Queen of Spades");
sessions.addTrack("Terraplane Blues");
FileWriter writer = new FileWriter("cds.xml");
Marshaller.marshal(sessions, writer);
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace(System.err);
}
}
}
编组生成的XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<CD>
<artist>Eric Clapton</artist>
<name>Sessions for Robert J</name>
<tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="java:java.lang.String">Little Queen of Spades</tracks>
<tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="java:java.lang.String">Terraplane Blues</tracks>
</CD>
从生成的XML文档解组,生成Java 对象的代码:
public class IntrospectUnmarshaller {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
try {
FileReader reader = new FileReader("cds.xml");
CD cd = (CD) Unmarshaller.unmarshal(CD.class, reader);
System.out.println("CD title: " + cd.getName());
System.out.println("CD artist: " + cd.getArtist());
List tracks = cd.getTracks();
if (tracks == null) {
System.out.println("No tracks.");
} else {
for (Iterator i = tracks.iterator(); i.hasNext();) {
System.out.println("Track: " + i.next());
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace(System.err);
}
}
}
结果输出:
CD title: Sessions for Robert J
CD artist: Eric Clapton
Track: Little Queen of Spades
Track: Terraplane Blues
内省模式的缺点:
1、Java 类及属性与XML文档的元素、属性之间的绑定的命名规则是由Castor XML框架定义的,这是可能改变的,如果改变了,已有代码可能不能运行。
2、如果XML文档的元素、属性名是我们无法控制的,则无法解决。
3、无法解决一个Java 类映射到多个平台的XML文档(每个平台的XML文档都不同)的情况。