以下例子示例了如何使用castor转换xml到对象的常见问题配置。

1. 定义要转换到的bean

package test.person;

import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class PersonBean {

private String name;
   
    private String email;

private int age;
   
    private String hobby;
   
    private boolean mailPrivate;
   
    private String dummy;
   
    public String nation;
   
    public String getName() {
        return name;
    }

public void setName(String name) {
        this.name = name;
    }

public String getEmail() {
        return email;
    }

public void setEmail(String email) {
        this.email = email;
    }
   
    public int getAge() {
        return age;
    }

public void setAge(int age) {
        this.age = age;
    }

public String getHobby() {
        return hobby;
    }

public void setHobby(String hobby) {
        this.hobby = hobby;
    }

public boolean isMailPrivate() {
        return mailPrivate;
    }

public void setMailPrivate(boolean mailPrivate) {
        this.mailPrivate = mailPrivate;
    }

public String getDummy() {
        return dummy;
    }

public void setDummy(String dummy) {
        this.dummy = dummy;
    }

public String toString() {
        return new ReflectionToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).toString();
    }

}

2. 定义数据xml文件。

<?xml version="1.0" encoding="UTF-8"?>

<Person>
  <Name>lee</Name>
  <Age>30</Age>
 
  <Address>
    <Mails>
      <Email private="true">liliang2005@gmail.com</Email>
    </Mails>
  </Address>

<Nation>Chinese</Nation>
</Person>

对应关系:

1) Name标签对应PersonBean.name

2) Age标签对应PersonBean.age

3) Email标签的内容对应PersonBean.email

4) Email标签的属性private对应PersonBean.mailPrivate

5) PersonBean.hobby不需要从数据xml中获得。

6) PersonBean.dummy期望的对应元素是Person/xxx,但是数据xml文件中并不存在。

3.定义映射对象

<?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="test.person.PersonBean">
    <map-to xml="Person"/>
   
    <field name="Name" type="java.lang.String">
      <bind-xml name="Name" node="element"/>
    </field>
   
    <field name="Age" type="integer">
      <bind-xml name="Age" node="element"/>
    </field>

<field name="Email" type="java.lang.String">
      <bind-xml name="Email" location="Address/Mails" node="element"/>
    </field>

<field name="MailPrivate" type="boolean">
      <bind-xml name="private" location="Address/Mails/Email" node="attribute"/>
    </field>

<field name="Dummy" type="java.lang.String">
      <bind-xml name="xxx" node="element"/>
    </field>

<field name="nation" type="java.lang.String" direct="true">
      <bind-xml name="Nation" node="element"/>
    </field>

</class>

</mapping>

要点:

1)map-to标签表示从xml的哪个节点开始映射对象。

2) field元素中属性name的值,推荐使用setXXX属性去掉set后的字符串。castor是按照name属性的值来反射生成setXXX方法。如果setXXX方法名称是按照JavaBean约定的命名规则定义的话,name属性值用小写字母开头也可。

3) castor默认对于含有子节电的每个xml元素都认为是一个对象,要想不通过建立对象直接关联值的话,使用location属相指定XPath的相对路径

4)如果xml中不存在某个期望的元素,castor会忽略映射。

5)如果JavaBean中的对象没有set方法,可以使用direct="true"来直接赋值,前提是JavaBean的属性必须定义成public

6) location属性不作为bind-xml的标志符,意味着如果在class元素内有多个<bind-xml>节点含有相同name属性值的话,castor将会出错,并抛出如下异常

element xxx occurs more than once

参见

http://jira.codehaus.org/browse/CASTOR-690

4. 测试代码

package test.person;

import java.io.FileReader;
import java.io.Reader;

import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.xml.Unmarshaller;

import test.ShareClass;

public class PersonBeanTest {

/**
     * @param args
     */
    public static void main(String[] args) throws Exception{
        test1();
    }

public static void test1() throws Exception{
        Mapping mapping = new Mapping();
       
        String mappingFile = PersonBeanTest.class.getClassLoader().getResource("test/person/person-mapping.xml").getFile();
        mapping.loadMapping(mappingFile);
       
        Unmarshaller unmarshaller = new Unmarshaller(mapping);
        unmarshaller.setIgnoreExtraElements(true);
        unmarshaller.setIgnoreExtraAttributes(true);
       
        String dataFile = PersonBeanTest.class.getClassLoader().getResource("test/person/person.xml").getFile();
        Reader reader = new FileReader(dataFile);
        PersonBean pb = (PersonBean)unmarshaller.unmarshal(reader);
       
        System.out.println(pb);
    }
}

输出结果

test.person.PersonBean@15e9756[
  name=lee
  email=aaa@gmail.com
  age=30
  hobby=<null>
  mailPrivate=true
  dummy=<null>
  nation=Chinese
]

注意:

1)如果JavaBean中含有在xml中没有对应元素,如果不设置setIgnoreExtraElements和setIgnoreExtraAttributes为true的话,castor将会抛出异常。

2) 在多线程环境中,应每次new一个Unmarshaller对象实例保证线程安全,否则可以使用Unmarshaller的静态方法。

3)

5.其他

对象嵌套的映射文件写法

5.1 可以将所有对象都放到<mapping>元素下

<mapping>

<class name="test.TestClass1">

......

</class>

<class name="test.TestClass2">

......

</class>

......

</mapping>

5.2 可以导入外部文件

<mapping>

<include href="mapping1.xml"/>

<include href="mapping2.xml"/>

......

<class name="test.TestClass">

......

</class>

</mapping>

更多参见castor官方文档

http://www.castor.org/reference/html-single/index.html

Castor映射java对象相关推荐

  1. Mybatis实现存取Mysql的Json字段映射Java对象

    Mybatis实现存取Mysql的Json字段映射Java对象 一.需求 二.解决方案 一.需求 在业务比较复杂的项目模块,为了应对多样化的场景,我们通常会在mysql中采用json格式来存储相应的信 ...

  2. java对象转excel_Java对象和Excel转换工具XXL-EXCEL

    一.简介 概述 XXL-EXCEL 是一个灵活的Java对象和Excel文档相互转换的工具. 一行代码完成Java对象和Excel之间的转换. 特性1.Excel导出:支持Java对象装换为Excel ...

  3. 使用castor实现xml和java对象的转换

    对于xml和java对象的转换这里用castor进行转换,当然还有别的方式 方式一:castor和xml映射文件配合 首先提供需要解析的XML(内容不重要,重要的是格式) <?xml versi ...

  4. java对象关系映射ROM

    一.对象关系映射ORM概述 对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术:简单的说,ORM是通过使 ...

  5. cassandra 数据到Java对象的映射绑定

    类似Hibernate和MyBatis的关系映射,自动帮你将查询数据或是修改的参数进行数据映射和绑定. 支持查询后返回数据ResultSet到Java对象的映射,支持修改.删除.查询之前参数的绑定. ...

  6. java的对象对象映射_Java对象到对象映射器

    java的对象对象映射 我在该项目上使用了Dozer一段时间. 但是,最近我遇到了一个非常有趣的错误,这促使我环顾四周,并尝试使用其他"对象到对象"映射器. 这是我找到的工具列表: ...

  7. Java对象到对象映射器

    我在该项目上使用了Dozer一段时间. 但是,最近我遇到了一个非常有趣的错误,它促使我环顾四周,并尝试使用其他"对象到对象"映射器. 这是我找到的工具列表: 推土机:推土机是Jav ...

  8. 业务代码的救星——Java对象转换框架MapStruct

    介绍 在业务项目的开发中,我们经常需要将Java对象进行转换,比如从外部HSF服务得到的对象转换为本域的业务对象domain object,将domain object转为数据持久层的data obj ...

  9. java map 结构体_业务代码的救星——Java 对象转换框架 MapStruct 妙用

    简介 在业务项目的开发中,我们经常需要将 Java 对象进行转换,比如从将外部微服务得到的对象转换为本域的业务对象 domain object,将 domain object 转为数据持久层的 dat ...

最新文章

  1. 时间序列挖掘-DTW加速算法FastDTW简介
  2. Django websocket 长连接使用
  3. Qt学习笔记之数据库
  4. Javascript事件绑定this
  5. zabbix2.2入门教程之编译安装(一)
  6. Guava、Spring 如何抽象观察者模式?
  7. 新电脑磁盘可存储信息数百年
  8. Android Studio系列教程六--Gradle多渠道打包
  9. Python打包exe程序太大的解决方法
  10. oracle 授权所有语句,oracle grant 授权语句
  11. 各自然带代表植被_十种常见自然带所对应的植被 十种常见自然带所对应的气候类型...
  12. Shell 脚本:DDNS for aliyun
  13. windows下使用endless报错:undefined: syscall.SIGUSR1
  14. 计算机保研er历程分享(浙软、厦大、华师、东南网安、东北、西电、中南......)
  15. STM32F103c8t6 - CubeMX 快速实现时钟配置 - 最大72M时钟的设定及实验测试
  16. 【RedNet2018】RedNet: Residual Encoder-Decoder Network for indoor RGB-D Semantic Segmentation
  17. 程序员的佛系炒股日常
  18. MySQL中cast()函数
  19. ubuntu硬盘修复
  20. java gc 时间_Java GC日志查看,GC日志时间分析

热门文章

  1. python之禅中文-「翻译」Python之禅
  2. python朗读网页-早上起床后不想动,让 Python 来帮你朗读网页吧
  3. python csv读取-python如何读取csv数据
  4. python文件输出-Python 文件和输入输出小结
  5. python数据分析的主要流程-python数据挖掘的基本流程有哪些?
  6. python基本使用-Python的基本用法
  7. python导入txt文件并绘图-Python读取txt数据文件,并作图
  8. 网页版python叫什么-用Python爬网页需要了解什么背景知识?
  9. python列表按照指定顺序排序-pandas中的DataFrame按指定顺序输出所有列的方法
  10. 使用OpenVINO ToolKit 实时推断