目的
在日常工作中,我们经常处理这些编组关系:JAVA对象 <--> XML文件;JAVA对象 <--> 数据库表。本文简单介绍一下JAVA对象和XML文件之间的绑定。虽然代码简单,但解决问题的广度与思路也是非常重要的。
首先,在Maven中引入要用到的jar包。
<dependency> <groupId>castor</groupId> <artifactId>castor</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>xerces</groupId> <artifactId>xerces</artifactId> <version>2.4.0</version> </dependency>
1. 写两个有包含关系的Bean
package shuai.study.castor.bean; import java.util.Collection; import java.util.LinkedList; public class CompanyBean { private String type; private String name; private String address; private Collection<EmployeeBean> employeeBeanCollection; public CompanyBean() { this.employeeBeanCollection = new LinkedList<EmployeeBean>(); } public String getType() { return this.type; } public void setType(String type) { this.type = type; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getAddress() { return this.address; } public void setAddress(String address) { this.address = address; } public Collection<EmployeeBean> getEmployeeBeanCollection() { return this.employeeBeanCollection; } public void setEmployeeBeanCollection(Collection<EmployeeBean> employeeBeanCollection) { this.employeeBeanCollection = employeeBeanCollection; } public void addEmployeeBean(EmployeeBean employeeBean) { this.employeeBeanCollection.add(employeeBean); } }
package shuai.study.castor.bean; public class EmployeeBean { private String id; private String name; private String sex; private int age; private String address; public String getId() { return this.id; } public void setId(String id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getSex() { return this.sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } public String getAddress() { return this.address; } public void setAddress(String address) { this.address = address; } }
2. 我们定义一个mapping文件,阐述JAVA对象和XML文件之间的关系。
<!DOCTYPE databases PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN" "http://castor.exolab.org/mapping.dtd"> <mapping> <description>Flight Route Mapping</description> <class name="shuai.study.castor.bean.CompanyBean"> <map-to xml="company" /> <field name="type"> <bind-xml name="type" node="attribute" /> </field> <field name="name"> <bind-xml name="name" /> </field> <field name="address"> <bind-xml name="address" /> </field> <field name="employeeBeanCollection" collection="collection" type="shuai.study.castor.bean.EmployeeBean"> <bind-xml name="employee" /> </field> </class> <class name="shuai.study.castor.bean.EmployeeBean" auto-complete="true"> <field name="id"> <bind-xml name="id" node="attribute" /> </field> <field name="name"> <bind-xml name="name" /> </field> <field name="sex"> <bind-xml name="sex" /> </field> <field name="age"> <bind-xml name="age" /> </field> <field name="address"> <bind-xml name="address" /> </field> </class> </mapping>
3. 写一个测试类,处理JAVA对象与XML文件之间的编组与反编组。
package shuai.study.castor; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; 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 shuai.study.castor.bean.CompanyBean; import shuai.study.castor.bean.EmployeeBean; public class CastorDemo { public static void main(String[] args) { EmployeeBean employeeBean = new EmployeeBean(); employeeBean.setId("37"); employeeBean.setName("shuai"); employeeBean.setSex("male"); employeeBean.setAge(30); employeeBean.setAddress("Ronghua South Road, Hi-Tech Zone, Chengdu"); CompanyBean companyBean = new CompanyBean(); companyBean.setType("foreign-owned"); companyBean.setName("Tieto"); companyBean.setAddress("Tianfu Software Park, Tianfu Avenue, Hi-Tech Zone, Chengdu"); companyBean.addEmployeeBean(employeeBean); try { // Mapping file path String companyEmployeeMapPath = CastorDemo.class.getResource("/file/map/company_employee_map.xml").getPath(); Mapping companyEmployeeMapping = new Mapping(); // Loading Mapping file companyEmployeeMapping.loadMapping(companyEmployeeMapPath); // Output file path, make sure this path exist String companyEmployeeOutputPath = CastorDemo.class.getResource("/file/output/company_employee_output.xml").getPath(); File companyEmployeeOutputFile = new File(companyEmployeeOutputPath); Writer companyEmployeeWriter = new FileWriter(companyEmployeeOutputFile); // Marshal Object to XML Marshaller marshaller = new Marshaller(companyEmployeeWriter); marshaller.setMapping(companyEmployeeMapping); marshaller.marshal(companyBean); // Un-Marshal XML to Object Reader companyEmployeeReader = new FileReader(companyEmployeeOutputFile); Unmarshaller unmarshaller = new Unmarshaller(companyEmployeeMapping); CompanyBean companyEmployeeBean = (CompanyBean) unmarshaller.unmarshal(companyEmployeeReader); System.out.println("Company is " + companyEmployeeBean.getName() + " at " + companyEmployeeBean.getAddress()); } catch (IOException ioe) { ioe.printStackTrace(System.err); } catch (MarshalException me) { me.printStackTrace(System.err); } catch (ValidationException ve) { ve.printStackTrace(System.err); } catch (MappingException me) { me.printStackTrace(System.err); } } }