castor解析Xml

来源:互联网 发布:淘宝女人针织衫 编辑:程序博客网 时间:2024/06/10 08:09

前言: 今天,我们来看一下一个解析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);    }}
0 0
原创粉丝点击