用Castor处理XML文档
——Castor可以完成Java和XML的相互转换 前面有介绍过json-lib这个框架,在线博文:http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html 以及Jackson这个框架,在线博文:http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html 它们都可以完成Java对象到XML的转换,但是还不是那么的完善。还有XStream对JSON及XML的支持,它可以对JSON或XML的完美转换。在线博文: http://www.cnblogs.com/hoojo/archive/2011/04/22/2025197.html 这里将介绍Castor来完成Java对象到xml的相互转换。它是怎么样转换的?和前面不同的是castor可以用一个mapping.xml文件来描述转换后的Java对象的xml基本形态,类似于xStream的annotation,这点还是非常不错的。下面我们就来看看Castor是怎么样完成Java对象到XML之间的相互转换吧。 一、准备工作 1、 官方资源 本示例会运用到如下依赖包(jar包):
资源及jar包下载:http://www.castor.org/download.html junit jar下载地址: https://github.com/KentBeck/junit/downloads 关于官方提供的mapping配置相关示例、文档: http://www.castor.org/xml-mapping.html ibm提供的castor方面的文档资料: http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&client=aff-cs-360se&hs=Gon&biw=1349&bih=603&q=castor+site%3Awww.ibm.com%2Fdeveloperworks%2Fcn%2Fxml%2F&aq=f&aqi=&aql=&oq= 2、 程序测试运行代码 package com.hoo.test;
import java.io.IOException; import java.io.StringReader;
import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.exolab.castor.mapping.Mapping; import org.exolab.castor.mapping.MappingException; import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.Marshaller; import org.exolab.castor.xml.Unmarshaller; import org.exolab.castor.xml.ValidationException; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.hoo.entity.Account; import com.hoo.entity.AccountArray; import com.hoo.entity.Birthday; import com.hoo.entity.ListBean; import com.hoo.entity.MapBean; /** * <b>function:</b>Castor完成Java对象到XML的相互转换 * 依赖jar: castor-1.3.jar * castor-1.3-core.jar * junit-4.8.2.jar * log4j-1.2.16.jar * commons-logging.jar * @author hoojo * @createDate 2011-4-21 下午07:57:26 * @file CastorTest.java * @package com.hoo.test * @project WebHttpUtils * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class CastorTest {
private Account bean = null;
private Mapping mapping = new Mapping(); private StringWriter writer = null; private StringReader reader = null; @Before void init() { bean = new Account();
bean.setAddress("北京");
bean.setEmail("email");
bean.setId(1); bean.setName("jack");
Birthday day = new Birthday();
day.setBirthday("2010-11-22");
bean.setBirthday(day); try {
* 加载mapping.xml,此文件是对需要转换的Java对象的配置描述,
* 即:转换后的Java对象的xml内容的转换规则 */ mapping.loadMapping(System.getProperty("user.dir") + "srcmapping.xml"); } catch (IOException e) {
e.printStackTrace(); catch (MappingException e) { } } @After void destory() { bean = null; mapping = null; if (writer != null) {
writer.flush(); writer.close(); } if (reader != null) { reader.close(); } } e.printStackTrace();
} System.gc(); void fail(Object o) { System.out.println(o); void failRed(Object o) { System.err.println(o); } Mapping对象可以完成Java对象到XML的编组和解组,它需要先设定一个mapping.xml,通过xml对JavaObject的描述。来完成JavaObject的编组、解组工作。 3、 看看即将被转换的JavaEntity代码 Account package com.hoo.entity;
class Account { private int id;
private String name; private String email; private String address; private Birthday birthday; //setter、getter @Override public String toString() { return this.id + "#" + this.name + this.email + this.address + this.birthday; Birthday 首先,看看这个xml文档的根元素是mapping,在mapping中可以配置class。也就是我们要转换的JavaObject的配置描述了。 class元素的name属性就是配置的JavaObject的classpath路径了。 关于class元素的auto-complate属性,如果这个属性的值为ture。那么编组后的xml,castor会自动给没有在mapping配置文件进行配置的属性自动编组(转换)到xml中。如果为false,那么在mapping配置文件中出现的属性将在编组后不现在在编组后的xml中。 map-to就是当前class编组后的xml文档的节点元素名称。 field就是描述JavaObject中的属性,name是Java对象的属性名称,type是类型。关于配置的type类型也有规定,你可以参考:http://www.castor.org/xml-mapping.html的field配置讲解。 而field还有其他的属性配置,如get-method应该是getter方法、set-method应该是setter的方法、has-mehtod应该是hashCode方法,有时候我们不一定要提高getter、setter方法,我们需要用自己的方法名称来代替setter、getter。如果当前field配置的是集合类型,那么你需要给field元素配置collection属性。 bind-xml就是绑定(编组)成xml后的xml内容的描述,name就是编组后xml的节点元素名称,node有2个值,分别是attribute、element。attribute是属性,它会在节点元素的属性中显示,例如:<account id=”2”></account> 而element则是单独的一个元素,例如:<account><id>2</id></account> 就这个样子的。 mapping.xml还可以有其他标签,如: <include href="other_mapping_file.xml"/> 导入外部xml文件,可以分多个配置。 好了,先将这么多的mapping方面的内容。我们还是看看实际运行的示例吧,代码如下: * <b>function:</b>将XML内容解组成Java对象
* @createDate 2011-4-22 下午12:13:28 void bean4Mapping2XML() { Marshaller mar = new Marshaller(writer);
mar.setMapping(mapping); mar.marshal(bean); reader = new StringReader(writer.toString());
Unmarshaller unmar = new Unmarshaller(Account.class); unmar.setMapping(mapping); Account account = (Account) unmar.unmarshal(reader); 运行后结果如下: 发现id没有显示在xml中,那么我们再将auto-complate的属性设置true,会有什么惊喜? 发现id又回来了,但是Account的配置中并没有配置id的field。这是为什么,其实auto-comlate在上面已经讲过了。Castor在编组时会自动将int类型的属性,显示在父元素的属性中。并且JavaObject中有的属性没有在mapping配置文件中配置,castor也会自动将其编组在xml中。 下面我们看看map-to配置的用法,map-to的主要属性是name,也就是我们把当前根元素重命名的名称。Map-to还有2个属性可以用,分别是ns-uri、ns-prefix。看名称就知道它大概的意识,一个是命名空间的uri另一个则是命名空间的前缀。我们给上面mapping加上这两个属性看看。 <map-to xml="Account" ns-uri="http://hoojo.cnblogs.com" ns-prefix="castor"/> <castor:Account xmlns:castor="http://hoojo.cnblogs.com" id="1"><castor:name>jack</castor:name><castor:email>email</castor:email> <castor:address>北京</castor:address><castor:生日 birthday="2010-11-22"/></castor:Account>
1#jack#email#北京#2010-11-22 发现了什么?节点元素都带上了ns-prefix的值,而根元素则有了xml的ns。 2、 将一段XML格式字符串转换成JavaBean @Test
void readBean4Mapping2XML() { "<Account id="2241"><name>jack</name><email>email</email><address>北京</address><生日 birthday="2010-11-22"/></Account>";
reader = Unmarshaller unmar = unmar.setMapping(mapping);
Account account = (Account) unmar.unmarshal(reader); fail(account); 2241#jack#email#北京#2010-11-22 3、 将XML内容解组成Java的Array * <b>function:</b>将XML内容解组成Java的Array
* @createDate 2011-4-22 下午12:14:50 void array4Mapping2XML() { AccountArray array = new AccountArray();
array.setAccounts(acc); Marshaller mar = mar.setMapping(mapping);
mar.marshal(array); new Unmarshaller(AccountArray. array = (AccountArray) unmar.unmarshal(reader);
fail(array.getSize()); fail(array.getAccounts()[0]); fail(array.getAccounts()[1]); AccountArray的mapping配置如下: 4、 将Map编组、解组成JavaObject * <b>function:</b>xml转换成Java的Map
* @createDate 2011-4-22 下午12:15:18 void map4Mapping2XML() { MapBean mapBean = new MapBean();
Map<String,Object> map = new HashMap<String,Object>();
map.put("No1",bean);
bean = bean.setName( bean.setId(223);
"No2",244)"> mapBean.setMap(map); mar.marshal(mapBean); new Unmarshaller(MapBean. mapBean = (MapBean) unmar.unmarshal(reader);
fail(mapBean.getMap()); Mapping配置 5、 JavaList编组、解组XML * <b>function:</b>List到XML的相互转换
* @createDate 2011-4-22 下午12:16:04 @SuppressWarnings("unchecked")
void listForMapping2XML() { writer = list.add(bean);
ListBean listBean = new ListBean();
listBean.setList(list); mar.marshal(listBean); new Unmarshaller(ListBean. listBean = (ListBean) unmar.unmarshal(reader);
fail(listBean.getList().size()); for (Account acc : (List<Account>)listBean.getList()) { fail(acc); ="com.hoo.entity.ListBean"="listBean"="list" ="arraylist" ="beans" 结果: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |