Castor学习笔记 (转载)
1.?Castor是什么
????Castor是一种将Java对象和XML自动绑定的开源软件.?
它可以在Java对象,XML文本,SQL数据表以及LDAP目录之间绑定.
????网址:?http://www.castor.org/
2.?Castor使用
????Java对象指的是具有setX和getX方法的JavaBean,将Castor
用于JavaBean具体使用方法如下:
????缺省用法:?缺省用法指的是没有使用映射格式描述文件时的用法
??????import?java.io.*;
??????import?org.exolab.castor.xml.*;
??????public?class?Test{
??????
??public?static?void?main(String[]?argv)?{?
????????//?build?a?test?bean
????????FlightBean?bean?=?new?FlightBean();
????????bean.setCarrier("AR");
????????bean.setNumber(426);
????????bean.setDepartureTime("6:23a");
????????bean.setArrivalTime("8:42a");
????????try?{
???????????//?write?it?out?as?XML
????????????File?file?=?new?File("test.xml");
????????????Writer?writer?=?new?FileWriter(file);
????????????Marshaller.marshal(bean,?writer);
????????????//?now?restore?the?value?and?list?what?we?get
????????????Reader?reader?=?new?FileReader(file);
????????????FlightBean?read?=?(FlightBean)Unmarshaller.unmarshal(FlightBean.class,?reader);
????????????System.out.println("Flight?"+read.getCarrier()+read.getNumber()?+?
????????????????"?departing?at?"?+?
????????????????read.getDepartureTime()?+"?and?arriving?at?"?+?read.getArrivalTime());????????????
???????????}?catch?(IOException?ex)?{
????????????????ex.printStackTrace(System.err);
???????????}?catch?(MarshalException?ex)?{
???????????????ex.printStackTrace(System.err);
???????????}?catch?(ValidationException?ex)?{
??????????????ex.printStackTrace(System.err);
???????????}
???????}
?????}????
程序运行结果:
D:\java>count.bat???(这个文件请下载我的,设置classpath)
D:\java>set?CLASSPATH=d:\java\jar\xercesImpl.jar;d:\java\jar\castor-0.9.5.3-xml.
jar;;d:\jdk1.5\lib;d:\java
D:\java>javac??FlightBean.java(这个文件请下载我的)
D:\java>javac?Test.java
D:\java>java?Test
Flight?AR426?departing?at?6:23a?and?arriving?at?8:42a
?缺省用法生成的XML文件test.xml如下:
<?xml?version="1.0"?encoding="UTF-8"?>
<flight-bean?number="426">
??<arrival-time>8:42a</arrival-time>
??<departure-time>6:23a</departure-time>
??<carrier>AR</carrier>
</flight-bean>
??也就是说:
????对FlightBena中具有基本类型值的属性创建元素的一个属性(本例中只有number属性通过?getNumber()方法公开为int值)。?
????对于每个具有对象类型值的属性创建根元素的一个子元素(本例中的所有其他属性,因为它们是字符串)。?
标准用法:
????????????import?java.io.*;
????????????import?org.exolab.castor.xml.*;
????????????import?org.exolab.castor.mapping.*;
????????????public?class?Test1{
????????????????public?static?void?main(String[]?argv)?{
????????????????//?build?a?test?bean
?????????????????FlightBean?bean?=?new?FlightBean();
?????????????????bean.setCarrier("AR");
?????????????????bean.setNumber(426);
?????????????????bean.setDepartureTime("6:23a");
?????????????????bean.setArrivalTime("8:42a");
????????????????try?{
??????????????????//?write?it?out?as?XML
??????????????????Mapping?map=new?Mapping();
??????????????????map.loadMapping("mapping.xml");
??????????????????File?file?=?new?File("test1.xml");
??????????????????Writer?writer?=?new?FileWriter(file);
??????????????????Marshaller?marshaller?=new?Marshaller(writer);
??????????????????marshaller.setMapping(map);
??????????????????marshaller.marshal(bean);
??????????????????//?now?restore?the?value?and?list?what?we?get
??????????????????Reader?reader?=?new?FileReader(file);
??????????????????Unmarshaller?unmarshaller?=?new?Unmarshaller(map);
??????????????????FlightBean?read?=?(FlightBean)unmarshaller.unmarshal(reader);
??????????????????System.out.println("Flight?"?+?read.getCarrier()?+
???????????????????????read.getNumber()?+?"?departing?at?"?+
??????????????????read.getDepartureTime()?+"?and?arriving?at?"?+?read.getArrivalTime());
?????????????????}?catch?(IOException?ex)?{
???????????????????ex.printStackTrace(System.err);
?????????????????}?catch?(MarshalException?ex)?{
????????????????????ex.printStackTrace(System.err);
?????????????????}?catch?(ValidationException?ex)?{
????????????????????ex.printStackTrace(System.err);
?????????????????}catch?(MappingException?ex)?{
????????????????????ex.printStackTrace(System.err);
????????????}
???????}
?????}
程序结果:D:\java>java?Test1
Flight?AR426?departing?at?6:23a?and?arriving?at?8:42a
D:\java>
标准用法生成的XML文件test1.xml如下:
?<?xml?version="1.0"?encoding="UTF-8"?>
<flight?carrier="AR"?depart="6:23a"?arrive="8:42a"?number="426"/>
?这一般是我们期望的,只所以生成我们所期望的格式,是因为我们使用了映射格式描述文件mapping.xml。它也是XML文件:
<!DOCTYPE?databases?PUBLIC?
??"-//EXOLAB/Castor?Mapping?DTD?Version?1.0//EN"
??"http://castor.exolab.org/mapping.dtd">
<mapping>
??<description>Basic?mapping?example</description>
??<class?name="FlightBean"?auto-complete="ture">
????<map-to?xml="flight"/>
????<field?name="carrier">
??????<bind-xml?name="carrier"?node="attribute"/>
????</field>
????<field?name="departureTime">
??????<bind-xml?name="depart"?node="attribute"/>
????</field>
????<field?name="arrivalTime">
??????<bind-xml?name="arrive"?node="attribute"/>
????</field>
??</class>
</mapping>
?????????注意
??(1)?class标签里name应该是带有包名的JavaBean类全名
??(2)?map-to?xml="flight"指XML文件的根节点,区分大小写
??(3)?auto-complete="false"或没有auto-complete属性时number属性会没有
?
附件中是 一个 读和写的小例子
?
转载:
http://tech.e800.com.cn/articles/2009/49/1239282839662_1.html
?
http://www.java3z.com/cwbwebhome/article/article2a/238.html
?
?