Castor XML 简介和内省模式

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 类:
@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文档都不同)的情况。

猜你喜欢

转载自wen866595.iteye.com/blog/1068168