Castor简介


1. Castor是什么

Castor是一种将Java对象和XML自动绑定的开源软件.它可以在Java对象,XML文本,SQL数据表以及LDAP目录之间绑定.

Castor XML is an XML databinding framework. Unlike the two main XML APIs, DOM (Document Object Model) and SAX (Simple API for XML) which deal with the structure of an XML document, Castor enables one to deal with the data defined in an XML document through an object model which represents that data.
Castor能把Java对象和XML文档进行转换,使用户从复杂的XML解析中解放出来,更关注于数据而不是文档。

Castor 网址: http://www.360docs.net/doc/info-a879c332a32d7375a4178059.html/



2 Castor使用

Java对象指的是具有setX和getX方法的JavaBean,

将Castor用于JavaBean具体使用方法如下

缺省用法:缺省用法指的是没有使用映射格式描述文件时的用法

标准用法:标准用法指的是使用映射格式描述文件时的用法

实际上,Castor 不仅仅能用于本文所述的类 JavaBean 类。它也可以访问带有公共成员变量的简单数据对象类的数据。比如,稍微改动前述的 Test 类,您就可以对航班数据使用如下的定义,并最终得到同样的 XML 格式:



public class FlightData { public String carrier; public int number; public String departure; public String arrival; }




为了使 Castor 正常工作,一个类必须全部采用这种方式或那种方式。如果类定义了 任何 getX 或 setX 方法,Castor 就将其视作 bean,并在编组和解组时只使用这些方法



3 缺省用法下xml的格式



8:42a

6:23

AR

也就是说

对于具有基本类型值的属性创建元素的一个属性(本例中只有 number 属性通过 getNumber() 方法公开为 int 值)。对于每个具有对象类型值的属性创建根元素的一个子元素(本例中的所有其他属性,因为它们是字符串)



4 标准用法下xml格式



这一般是我们期望的,只所以生成我们所期望的格式,是因为我们使用了映射格式描述文件。它也是XML文件:

 

 

Basic mapping example 




















 









?注意class标签里name应该是带有包名的JavaBean类全名


?map-to xml="flight"指XML文件的根节点,区分大小写
 
?auto-complete=”false”或没有auto-complete属性时number属性会没有


=====
Castor绑定xml使用技巧(2011-01-19 18:41:45)转载标签: castor技巧it 分类: JAVA
1 castor.properties 缩进问题和命名规范

通过修改jar包下org\exolab\castor\castor.properties文件,使得

org.exolab.castor.indent=true
org.exolab.castor.xml.naming=mixed
加上上面的第一个属性就能使产生的xml有缩进,格式比较好看(调试的时候可以用用,正式环境还是去掉比较好)
第二属性设置后,生成的xml的元素名称就可以达到基本符合java的命名规范。



2 使用

auto-complete来化繁为简(不用写具体的绑定配置拉),采用castor默认的绑定配置方式,也即是

对于具有基本类型值的属性创建元素的一个属性(例如number 属性通过 getNumber() 方法公开为 int 值;

对于每个具有对象类型值的属性创建根元素的一个子元素。




3 使用代码获取castor的各个properties

从castor1.1开始,可以使用getProperty(String)和setProperty(String,String)编程来设置或者读取相应的属性值,可以使用这两个方法的类是org.exolab.castor.xml.Unmarshaller,org.exolab.castor.xml.Marshaller,org.exolab.castor.xml.XMLContext。
前两个类的setter方法只对相应实例的设置有效,毕竟Unmarshaller和Marshaller实例是通过createUnmarshaller()和createMarshaller()方法创建得来的。而XMLContext的setProperty()方法会修改全局的配置参数



==============

Castor进行XML数据绑定(2011-01-19 17:10:03)转载标签: castorxml数据绑定it 分类: JAVA
Castor是一个java object的OR Mapping工具,可以将java objects保存于database、xml文件和LDAP数据库中(目前版本好像LDAP支持有问题)。下面简单介绍一下怎样用Castor来操纵XML文件
1. 一 最简单的XML文件的操纵
1. 1 读取XML文件
有一个xml文件如下,表示了一个人的信息
person.xml


Bob Harris
222-222-2222

123 Foo Street

(123) 123-1234
(123) 123-1234
bob@http://www.360docs.net/doc/info-a879c332a32d7375a4178059.html

对应的java文件



import java.io.*;

public class Person {
private String name;
private String address;
private String ssn;
private String email;
private String homePhone;
private String workPhone;

// -- allows us to create a Person via the constructor
public Person(String name, String address, String ssn,
String email, String homePhone, String workPhone) {
http://www.360docs.net/doc/info-a879c332a32d7375a4178059.html

= name;
this.address = address;
this.ssn = ssn;
this.email = email;
this.homePhone = homePhone;
this.workPhone = workPhone;
}

// -- used by the data-binding framework
public Person() { }

// -- accessors
public String getName() { return name; }

public String getAddress() { return address; }

public String getSsn() { return ssn; }

public String getEmail() { return email; }

public String getHomePhone() { return homePhone; }

public String getWorkPhone() { return workPhone; }

// -- mutators
public void setName(String name) { http://www.360docs.net/doc/info-a879c332a32d7375a4178059.html = name; }

public void setAddress(String address) {
this.address = address;
}

public void setSsn(String ssn) { this.ssn = ssn; }

public void setEmail(String email) { this.email = email; }

public void setHomePhone(String homePhone) {
this.homePhone = homePhone;
}

public void setWorkPhone(String workPhone) {
this.workPhone = workPhone;
}


}




这是一个读取person.xml文件的例子



import org.exolab.castor.xml.*;
import java.io.FileReader;

public class ReadPerson {
public static void main(String args[]) {
try {
Person person = (Person)
Unmarshaller.unmarshal(Person.class,
new FileReader("person.xml"));
System.out.println("Person Attributes");
System.out.println("-----------------");
System.out.println("Name: " + person.getName() );
System.out.println("Address: " + person.getAddress() );
System.out.println("SSN: " + person.getSsn() );
System.out.println("Email: " + person.getEmail() );
System.out.println("Home Phone: " +
person.getHomePhone() );
System.out.println("Work Phone: " +
person.getWorkPhone() );
} catch (Exception e) {
System.out.println( e );
}
}
}


传统上,如果需要操纵XML文件,需要用SAX或者DOM来处理,比较繁琐,有了Castor提供的marshalling and unmarshalling功能,就可以方便的在xml和java object之间方便的映射了。




2. 2 生成XML文件
下面是生成XML文件的例子:




import org.exolab.castor.xml.*;
import java.io.FileWriter;

public class CreatePerson {
public static void main(String args[]) {
try {
// -- create a person to work with
Person person = new Person("Bob Harris",
"123 Foo Street", "222-222-2222",
"bob@http://www.360docs.net/doc/info-a879c332a32d7375a4178059.html", "(123) 123-1234",
"(123) 123-1234");

// -- marshal the person object out as a
FileWriter file = new FileWriter("bob_person.xml");
Marshaller.marshal(person, file);
file.close();
} catch (Exception e) {
System.out.println( e );
}
}
}




这是上面的CreatePerson生成的xml文件
bob_person.xml

222-222-2222

123 Foo Street
(123) 123-1234(123) 123-1234bob@http://www.360docs.net/doc/info-a879c332a32d7375a4178059.htmlBob Harris

3. 3 修改现有的XML文件
修改现有的XML文件也很简单



import org.exolab.castor.xml.*;
import java.io.FileWriter;
import java.io.FileReader;


public class ModifyPerson {
public static void main(String args[]) {
try {
// -- read in the person
Person person = (Person)
Unmarshaller.unmarshal(Person.class,
new FileReader("person.xml"));
// -- change the name
person.setName("David Beckham");
person.setEmail("David@http://www.360docs.net/doc/info-a879c332a32d7375a4178059.html");

// -- marshal the changed person back to disk
FileWriter file = new FileWriter("person.xml");
Marshaller.marshal(person, file);
file.close();
} catch (Exception e) {
System.out.println( e );
}
}
}

2. 二 复杂XML文件的操纵
这个例子演示了如果操纵复杂的xml文件
文件addressbook.xml如下



23 Whistlestop Ave

111-222-3333
roykeane@http://www.360docs.net/doc/info-a879c332a32d7375a4178059.html
720.111.2222
111.222.3333


123 Foobar Lane

222-333-444
juanveron@http://www.360docs.net/doc/info-a879c332a32d7375a4178059.html
720.111.2222
111.222.3333


222-222-2222
123 Foo Street

(123) 123-1234
(123) 123-1234
bob@http://www.360docs.net/doc/info-a879c332a32d7375a4178059.html




可以看到,addressbook包含多条记录,每条记录是一个通讯录。为了对应复杂的xml文件,需要一个mapping.xml文件,来说明xml文件的项目和java object的对应关系


http://www.360docs.net/doc/info-a879c332a32d7375a4178059.html/mapping.dtd">


A mapping file for our Address Book application




















§这样,就可以一样很方便的使用Castor来操纵这个XML文件了
同样,需要一个java文件来对应addressbook

import java.util.List;
import java.util.ArrayList;

public class Addressbook {
private String addressBookName;
private List persons = new ArrayList();

public Addressbook() { }

// -- manipulate the List of Person objects
public void addPerson(Person person) {
persons.add(person);
}

public List getPersons() {
return persons;
}

// -- manipulate the name of the address book
public String getName() {
return addressBookName;
}

public void setNa

me(String name) {
this.addressBookName = name;
}
}

察看addressbook的java 代码

import org.exolab.castor.xml.*;
import org.exolab.castor.mapping.*;

import java.io.FileReader;
import java.util.List;
import java.util.Iterator;

public class ViewAddressbook {
public static void main(String args[]) {
try {
// -- Load a mapping file
Mapping mapping = new Mapping();
mapping.loadMapping("mapping.xml");

Unmarshaller un = new Unmarshaller(Addressbook.class);
un.setMapping( mapping );

// -- Read in the Addressbook using the mapping
FileReader in = new FileReader("addressbook.xml");
Addressbook book = (Addressbook) un.unmarshal(in);
in.close();

// -- Display the addressbook
System.out.println( book.getName() );

List persons = book.getPersons();
Iterator iter = persons.iterator();

while ( iter.hasNext() ) {
Person person = (Person) iter.next();

System.out.println("\n" + person.getName() );
System.out.println("-----------------------------");
System.out.println("Address = "+ person.getAddress());
System.out.println("SSN = " + person.getSsn() );
System.out.println("Home Phone = " + person.getHomePhone() );
System.out.println("email = " + person.getEmail() );
}
} catch (Exception e) {
System.out.println( e );

=============
Castor绑定xml使用技巧
1 castor.properties 缩进问题和命名规范

通过修改jar包下org\exolab\castor\castor.properties文件,使得

org.exolab.castor.indent=true
org.exolab.castor.xml.naming=mixed
加上上面的第一个属性就能使产生的xml有缩进,格式比较好看(调试的时候可以用用,正式环境还是去掉比较好)
第二属性设置后,生成的xml的元素名称就可以达到基本符合java的命名规范。



2 使用

auto-complete来化繁为简(不用写具体的绑定配置拉),采用castor默认的绑定配置方式,也即是

对于具有基本类型值的属性创建元素的一个属性(例如number 属性通过 getNumber() 方法公开为 int 值;

对于每个具有对象类型值的属性创建根元素的一个子元素。




3 使用代码获取castor的各个properties

从castor1.1开始,可以使用getProperty(String)和setProperty(String,String)编程来设置或者读取相应的属性值,可以使用这两个方法的类是org.exolab.castor.xml.Unmarshaller,org.exolab.castor.xml.Marshaller,org.exolab.castor.xml.XMLContext。
前两个类的setter方法只对相应实例的设置有效,毕竟Unmarshaller和Marshaller实例是通过createUnmarshaller()和createMarshaller()方法创建得来的。而XMLContext的setProperty()方法会修改全局的配置参数






class.getClassLoader().getResources
this.getClass().getClassLoader().getResource("template");
首先,调用对象的getClass()方法是获得对象当前的类类型,这部分数据存在方法区中,而后在类类型上调用getClassL

oader()方法是得到当前类型的类加载器,我们知道在Java中所有的类都是通过加载器加载到虚拟机中的,而且类加载器之间存在父子关系,就是子知道父,父不知道子,这样不同的子加载的类型之间是无法访问的(虽然它们都被放在方法区中),所以在这里通过当前类的加载器来加载资源也就是保证是和类类型同一个加载器加载的。


相关文档