前言: 今天,我们来看一下一个解析xml的工具Castor,这个工具是公司的项目所用到的,用来解析xml报文。此前我所接触的解析xml的方式有Dom,Dom4j,Sax。而Castor工具应该是对Sax解析进行了封装(个人猜测,还未看源码,这个问题的正确性以后再确定)。在看公司的项目时,觉得自己对这些工具并不重视,想着晚上回来自己写个简单的Castor引用的简单demo,这个看似简单,但是在写的过程中遇到了不少困难。
首先,导包的问题,刚开始一直报错:
Java.lang.ClassNotFoundException:org.apache.xerces.parsers.SAXParser
刚开始研究了一会,不知道是什么问题,还以为是路径不对,因为用castor工具时需要导入commens-logging包 。一直有日志info level打出
/F:/WorkSpace/MyCastorTest/bin is not a URL, trying to convert it to a file URL
自己也是有些过于浮躁了,调试的时候明明就是info ,而不是error。还一味的以为是URL的错误。却忽略了后面的异常。很蠢吧,哎,犯这种低级错误真的对自己很无语,千万不能浮躁,慢慢的找问题,要不然会花更多的时间。折腾了一会后,才拿着异常信息百度寻找答案。后来才发现是缺少一个包:
因为xercesImpl.jar的缺失,导致了程序无法正常运行,这个包在网上可以轻易下到。
下面给出castor包的下载地址:
castor.jar
这个包笔者还是找了一段时间的,CSDN上该资源大多需要积分。
好了,下面正式给出代码:
先写两个实体类
package wangcc.entity;
public class User {
private Integer id;
private String name;
private double salary;
private Address address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "name" + "[" + name + "]" + "salary" + "[" + salary + "]"
+ "Address:" + address.toString();
};
}
package wangcc.entity;
public class Address {
private String province;
private String city;
private String country;
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String toString()
{
return "["+province+"_"+city+"_"+country+"]";
};
}
这是User.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN"
"http://castor.org/mapping.dtd">
<mapping>
<class name="wangcc.entity.User">
<map-to xml="User"/>
<field name="id" type="integer"></field>
<field name="name" type="string"></field>
<field name="salary" type="double"></field>
<field name="address" type="wangcc.entity.Address">
<bind-xml name="Address"></bind-xml>
</field>
</class>
</mapping>
test.xml
<User>
<id>24</id>
<name>kobe</name>
<salary>20000000.4</salary>
<Address>
<province>Calin</province>
<city>Los Angeles</city>
<country>Stea</country>
</Address>
</User>
package wangcc.castor;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.Reader;
import java.io.Writer;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.junit.Test;
import wangcc.entity.Address;
import wangcc.entity.User;
public class TestCastor {
public static void main(String[] args) throws Exception {
}
@Test
public void testToBean() throws Exception {
String mappingPath = TestCastor.class.getClassLoader()
.getResource("User.xml").getFile();
// String mappingPath = "F:\\TestCastor\\User.xml";
String xmlPath = TestCastor.class.getClassLoader()
.getResource("test.xml").getFile();
Mapping mapping = new Mapping();
// mapping相当于一个规定,一种标准,你的xml必须是符合这个xml文件标准的
mapping.loadMapping(mappingPath);
System.out.println(mappingPath);
Unmarshaller um = new Unmarshaller(mapping);
// String str =
// "<User><id>23</id><name>james</name><salary>2000000.4</salary><Address><province>kelifulan</province><city>akelong</city><country>LeBorn</country></Address></User>";
//
// Reader reader = new StringReader(str);
Reader reader = new FileReader(xmlPath);
User user = (User) um.unmarshal(reader);
System.out.println(user);
}
@Test
public void testToXml() throws Exception {
User user = new User();
user.setId(23);
user.setName("james");
user.setSalary(2000000.4);
Address address = new Address();
address.setProvince("kelifulan");
address.setCity("akelong");
address.setCountry("LeBorn");
user.setAddress(address);
Mapping mapping = new Mapping();
String mapppingPath = TestCastor.class.getClassLoader()
.getResource("User.xml").getFile();
mapping.loadMapping(mapppingPath);
String file = "F:\\TestCastor\\data.xml";
Writer fileWriter = new FileWriter(file);
// Writer writer = new StringWriter();
// Marshaller msa = new Marshaller(writer);
// msa.setEncoding("UTF-8");
// msa.setMapping(mapping);
// msa.marshal(user);
// String returnXml = writer.toString();
// System.out.println(returnXml);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
Marshaller msa = new Marshaller(fileWriter);
msa.setEncoding("UTF-8");
msa.setMapping(mapping);
msa.marshal(user);
}
}