首页 > > > 实现 Castor 数据绑定--转-2
;
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);
}
}
}
最后一个类如清单 3 所示,是一个用于解组的类。
清单 3. 用于测试解组的类
package ibm.xml.castor;
import java.io.FileReader;
import java.util.Iterator;
import java.util.List;
import org.exolab.castor.xml.Unmarshaller;
public class UnmarshalTester {
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);
}
}
}
像下面这样编译这些类:
[bmclaugh:~/Documents/developerworks/castor] javac -d . *.java
Note: CD.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
如果使用的是 Java 5 或更高的版本,而在CD.java中没有使用参数化的类型,就会出现上面的警告。不要担心,这不会有什么影响。现在需要运行编组程序测试类。
[bmclaugh:~/Documents/developerworks/castor] java ibm.xml.castor.MarshalTester
找到并打开cds.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 文档中看到在MarshalTester类中创建的 CD 的所有信息。
现在需要确保可以将 XML 文档转换回 Java。运行解组测试程序:
[bmclaugh:~/Documents/developerworks/castor] java ibm.xml.castor.UnmarshalTester
CD title: Sessions for Robert J
CD artist: Eric Clapton
Track: Little Queen of Spades
Track: Terraplane Blues
这些代码非常简单,无需解释。如果你获得了这样的输出,就说明已经用 Castor 打开了 XML 文件,并且已经将其转换为一个 Java 类。
现在 — 我们假设您已经用UnmarshalTester获得了相同的cds.xml和输出 — 您安装的 Castor 能够正常运行。您还没有使用 Castor 做任何比较复杂的工作,只是确保了它能正常运行、正确设置了 JAR 文件以及 Castor 能够根据需要实现不同的功能。
回页首
结束语
现在,您有了一个能够正常运行的 Castor 环境。清单1、2和3让您对 Castor 的工作原理有了一定的了解。看看自己能否实现编组和解组功能吧。在下一篇文章中,您将会更进一步了解 Castor 的 XML 特性,以及如何使用映像文件。到那时,请继续体验 Castor 的功能。
原文:http://www.ibm.com/developerworks/cn/xml/x-xjavacastor1/index.html
第 2 部分: 编组和解组 XML
需要准备什么
开始之前需要保证具备了本文所需要的前提条件。确保满足这些要求最简单的办法就是按照 本系列第一篇文章(链接参见本文参考资料部分)介绍的步骤操作。第一篇文章介绍了如何下载、安装和配置 Castor,并用一些简单的类进行了测试。
从您手头的项目中选择一些类转换成 XML 然后再转换回来也没有问题。本文(以及上一期文章)提供了一些例子,但是要掌握 Castor,最好的办法是把这里学到的东西应用到您自己的项目中。首先从一些简单的对象类开始,比如代表人、唱片、图书或者某种其他具体对象的类。然后可以阅读本文中关于映射的内容,从而增加一些更复杂的类。
回页首
编组 101
Castor 最基本的操作是取一个 Java 类然后将类的实例编组成 XML。可以把类本身作为顶层容器元素。比如Book类很可能在 XML 文档中得到一个名为 “book” 的根元素。
类的每个属性也表示在 XML 文档中。因此值为 “Power Play” 的title属性将生成这样的 XML:
<title>Power Play</title>
很容易由此推出一个简单 Java 类所生成的 XML 文档的其余部分。
回页首
编组类的实例
开始编组代码之前有几点需要注意。第一,只能编组类的实例而不能编组类本身。类是一种结构,等同于 XML 约束模型,如 DTD 或 XML Schema。类本身没有数据,仅仅定义了所存储的数据的结构和访问方法。
实例化类(或者通过工厂以及其他实例生成机制获得)将赋予它具体的形式。然后用实际数据填充实例的字段。实例是惟一的,它和同一类的实例具有相同的结构,但数据是不同的。图 1 直观地说明了这种关系。
图 1. 类提供结构,实例即数据

因而编组的只能是实例。后面将看到如何使用约束模型和映射文件改变 XML 的结构。但是现在要做的是让 XML 结构(元素和属性)和 Java 结构(属性)匹配。
基本的编组
清单 1 是本文中将使用的一个简单的Book类。
清单 1. Book 类
package ibm.xml.castor;
public class Book {
/** The book's ISBN */
private String isbn;
/** The book's title */
private String title;
/** The author's name */
private String authorName;
public Book(String isbn, String title, String authorName) {
this.isbn = isbn;
this.title = title;
this.authorName = authorName;
}
public String getIsbn() {
return isbn;
}
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
public String getAuthorName() {
return authorName;
}
}
编译上述代码将得到Book.class文件。这个类非常简单,只有三个属性:ISBN、标题和作者姓名(这里有些问题,暂时先不管)。仅仅这一个文件还不够,Castor 还需要几行代码将Book类的实例转化成 XML 文档。清单 2 中的小程序创建了一个新的Book实例并使用 Castor 转化成 XML。
清单 2. Book 编组器类
package ibm.xml.castor;
import java.io.FileWriter;
import org.exolab.castor.xml.Marshaller;
public class BookMarshaller {
public static void main(String[] args) {
try {
Book book = new Book("9780312347482", "Power Play", "Joseph Finder");
FileWriter writer = new FileWriter("book.xml");
Marshaller.marshal(book, writer);
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace(System.err);
}
}
}
编译然后运行该程序。将得到一个新文件book.xml。打开该文件将看到如下所示的内容:
清单 3. 编译后的程序创建的 XML
<?xml version="1.0" encoding="UTF-8"?>
<book><author-name>Joseph Finder</author-name>
<isbn>9780312347482</isbn><title>Power Play</title></book>
为了清晰起见我增加了断行。实际生成的 XML 文档在author-name元素的结束标记和isbn元素的开始标记之间没有断行。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2730/viewspace-3136581/ ,如需转载,请注明出处,否则将追究法律责任。