castor解析Xml

前言: 今天,我们来看一下一个解析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);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值