`
redwave
  • 浏览: 39746 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Castor 进行 XML 数据绑定

    博客分类:
  • Java
阅读更多

今日看了些Castor方面的文章,对castor有了些了解。把用法写在这里,已备我和他人查用.

What Castor?

Java对象与 XML 文档之间来回转换的简单方法

Castor的优势:

1.Castor 几乎是 JAXB 的替代品.可以轻易地将所有 JAXB 代码转变为 Castor

2.提供了 JDO 功能。JDO 也就是 Java Data Objects,是驱动 Java-to-RDBMS 编组和解组的底层技术

3.在数据绑定领域提供了许多的功能,无需使用模式便可在 Java 和 XML 之间进行转换,提供一种比 JAXB 更易于使用的绑定模式,以及能够对关系数据库和 XML 文档进行编组(marshal)和解组(unmarshal)

 

Castor下载:

Castor1.2 http://dist.codehaus.org/castor/1.2/castor-1.2.zip

Castor依赖项http://dist.codehaus.org/castor/1.2/castor-1.2-src.zip 下载解压后在/lib下

 

简单的例子:

拷贝别人的例子,经过测试通过

1.创建Book类

import java.util.LinkedList;
import java.util.List;

public class Book {
 private String isbn; 
 private String title;

private List authors; //作者类对象

 public Book(String isbn, String title, List authors) {
  this.isbn = isbn;
  this.title = title;
  this.authors = authors;
 }

 public Book(String isbn, String title, Author author) {
  this.isbn = isbn;
  this.title = title;
  this.authors = new LinkedList();
  authors.add(author);
 }

 public String getIsbn() {
  return isbn;
 }

 public void setTitle(String title) {
  this.title = title;
 }

 public String getTitle() {
  return title;
 }

 public void setAuthors(List authors) {
  this.authors = authors;
 }

 public List getAuthors() {
  return authors;
 }

public void addAuthor(Author author) {
  authors.add(author);
 }
}

2.创建作者类

public class Author {

 private String firstName, lastName;

 private int totalSales;

public Author(String firstName, String lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
 }

 public String getFirstName() {
  return firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public void setTotalSales(int totalSales) {
  this.totalSales = totalSales;
 }

 public void addToSales(int additionalSales) {
  this.totalSales += additionalSales;
 }

public int getTotalSales() {
  return totalSales;
}
}

3.创建编组器类

import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;

import org.exolab.castor.xml.Marshaller;

public class BookMarshaller {

 public static void main(String[] args) {
  try {
   Author finder = new Author("Joseph", "Finder");
   Book book = new Book("9780312347482", "Power Play", finder);
   FileWriter writer = new FileWriter("book.xml"); //作者为一人
   Marshaller.marshal(book, writer);

   List book2Authors = new ArrayList();
   book2Authors.add(new Author("Douglas", "Preston"));
   book2Authors.add(new Author("Lincoln", "Child"));
   Book book2 = new Book("9780446618502", "The Book of the Dead",
     book2Authors);//作者为多人
   writer = new FileWriter("book2.xml");
   Marshaller.marshal(book2, writer);

  } catch (Exception e) {
   System.err.println(e.getMessage());
   e.printStackTrace(System.err);
  }
 }
}

 Castor也支持泛型,如果用jdk1.5/1.6开发的话可以在对list<obj>

4.编译并运行后的结果

<?xml version="1.0" encoding="UTF-8"?>
<book><isbn>9780446618502</isbn><title>The Book of the Dead</title>
<author-names xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:type="java:java.lang.String">Douglas Preston</author-names>
<author-names xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:type="java:java.lang.String">Lincoln Child</author-names>
</book>

5.解组图书

public class BookUnmarshaller {

 public static void main(String[] args) {
  try {
   FileReader reader = new FileReader("book.xml");
   Book book = (Book) Unmarshaller.unmarshal(Book.class, reader);
   System.out.println("Book ISBN: " + book.getIsbn());
   System.out.println("Book Title: " + book.getTitle());
   List authors = book.getAuthors();
   for (Iterator i = authors.iterator(); i.hasNext();) {
    Author author = (Author) i.next();
    System.out.println("Author: " + author.getFirstName() + " "
      + author.getLastName());
   }

   System.out.println();

reader = new FileReader("book2.xml");
   book = (Book) Unmarshaller.unmarshal(Book.class, reader);
   System.out.println("Book ISBN: " + book.getIsbn());
   System.out.println("Book Title: " + book.getTitle());
   authors = book.getAuthors();
   for (Iterator i = authors.iterator(); i.hasNext();) {
    Author author = (Author) i.next();
    System.out.println("Author: " + author.getFirstName() + " "
      + author.getLastName());
   }
  } catch (Exception e) {
   System.err.println(e.getMessage());
   e.printStackTrace(System.err);
  }
 }
}

运行后结果

Book ISBN: 9780312347482
Book Title: Power Play
Author: Joseph Finder

Book ISBN: 9780446618502
Book Title: The Book of the Dead
Author: Douglas Preston
Author: Lincoln Child

 

需要注意的:

Book类和Author类必须包含空参数的构造方法,因为Castor 主要通过反射和调用 Class.forName(类名).newInstance() 这样的方法进行解组

分享到:
评论
1 楼 jelver 2009-12-10  
惭愧啊,今天才发现有这么个好东西

相关推荐

Global site tag (gtag.js) - Google Analytics