以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 Java/Eclipse 』  (http://bbs.xml.org.cn/list.asp?boardid=41)
----  有没有人用过Castor的?(紧急求助)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=41&rootid=&id=8811)


--  作者:凤舞九天
--  发布时间:7/15/2004 12:46:00 PM

--  有没有人用过Castor的?(紧急求助)
  Mapping mapping = new Mapping();
  mapping.loadMapping("mapping.xml");

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

执行到第四句时出错如下:


org.exolab.castor.mapping.MappingException: Could not find the class node
 at org.exolab.castor.mapping.loader.MappingLoader.createDescriptor(MappingLoader.java:396)
 at org.exolab.castor.xml.XMLMappingLoader.createDescriptor(XMLMappingLoader.java:202)
 at org.exolab.castor.mapping.loader.MappingLoader.loadMapping(MappingLoader.java:289)
 at org.exolab.castor.mapping.Mapping.getResolver(Mapping.java:291)
 at org.exolab.castor.mapping.Mapping.getResolver(Mapping.java:246)
 at org.exolab.castor.xml.Unmarshaller.setMapping(Unmarshaller.java:423)
 at com.victorysoft.wellinfo.ViewFunctree.main(ViewFunctree.java:94)


--  作者:凤舞九天
--  发布时间:7/15/2004 12:52:00 PM

--  
哭求,在线等


--  作者:mfc42d
--  发布时间:7/16/2004 12:24:00 PM

--  
请你把详细的源码和xml文件贴出来
--  作者:凤舞九天
--  发布时间:7/26/2004 2:46:00 PM

--  
刚刚把这个问题搞定了:)
直接贴找到的结论吧:

How to get Address Books from XML file using mapping file
2004-03-11 13:19:03  starlightpurple
Hi,

Is your Person class in a package? If so you will need to modify the mapping.xml file to include the package name before the class name. For example if you put the Person class in a package called MyPackage you would make the following changes to the mapping.xml file:


* change <class name="Person"> to:
<class name="MyPackage.Person">


* change <field name="persons" type="Person" collection="collection" /> to:
<field name="persons" type="MyPackage.Person" collection="collection" />


Hope this helps.


--  作者:凤舞九天
--  发布时间:7/26/2004 2:50:00 PM

--  
源码如下:
首先声明是转贴的哦:)


Castor是一个java object的OR Mapping工具,可以将java objects保存于database、xml文件和LDAP数据库中(目前版本好像LDAP支持有问题)。下面简单介绍一下怎样用Castor来操纵XML文件

1. 一 最简单的XML文件的操纵
1. 1 读取XML文件
有一个xml文件如下,表示了一个人的信息
person.xml
<?xml version="1.0"?>
<person>
<name>Bob Harris</name>
<ssn>222-222-2222</ssn>
<address>123 Foo Street</address>
<work-phone>(123) 123-1234</work-phone>
<home-phone>(123) 123-1234</home-phone>
<email>bob@harris.org</email>
</person>
对应的java文件
/*
* Person.java
*
*/

/**
*
* @author yj
*/
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) {
this.name = 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) { this.name = 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;
}


}



--  作者:凤舞九天
--  发布时间:7/26/2004 2:51:00 PM

--  

这是一个读取person.xml文件的例子
/*
* ReadPerson.java
*
* Created on 2001&Auml;ê12&Ocirc;&Acirc;25&Egrave;&Otilde;, &Iuml;&Acirc;&Icirc;&ccedil;3:32
*/

/**
*
* @author yj
*/
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之间方便的映射了。


--  作者:凤舞九天
--  发布时间:7/26/2004 2:52:00 PM

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

/*
* CreatPerson.java
*
* Created on 2001年12月25日,下午5:06
*/

/**
*
* @author yj
*/
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@harris.org", "(123) 123-1234",
"(123) 123-1234");

// -- marshal the person object out as a <person>
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
<?xml version="1.0"?>
<person><ssn>222-222-2222</ssn><address>123 Foo Street</address><work-phone>(123) 123-1234</work-phone><home-phone>(123) 123-1234</home-phone><email>bob@harris.org</email><name>Bob Harris</name></person>


--  作者:凤舞九天
--  发布时间:7/26/2004 2:53:00 PM

--  
3. 3 修改现有的XML文件
修改现有的XML文件也很简单
/*
* ModifyPerson.java
*
* Created on 2001&Auml;ê12&Ocirc;&Acirc;25&Egrave;&Otilde;, &Iuml;&Acirc;&Icirc;&ccedil;5:12
*/

/**
*
* @author yj
*/
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@beckham.com");

// -- 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 );
}
}
}


--  作者:凤舞九天
--  发布时间:7/26/2004 2:53:00 PM

--  
2. 二 复杂XML文件的操纵
这个例子演示了如果操纵复杂的xml文件
文件addressbook.xml如下
<?xml version="1.0"?>
<addressbook name="Manchester United Address Book">
<person name="Roy Keane">
<address>23 Whistlestop Ave</address>
<ssn>111-222-3333</ssn>
<email>roykeane@manutd.com</email>
<home-phone>720.111.2222</home-phone>
<work-phone>111.222.3333</work-phone>
</person>
<person name="Juan Sebastian Veron">
<address>123 Foobar Lane</address>
<ssn>222-333-444</ssn>
<email>juanveron@manutd.com</email>
<home-phone>720.111.2222</home-phone>
<work-phone>111.222.3333</work-phone>
</person>
<person name ="Bob Harris">
<ssn>222-222-2222</ssn>
<address>123 Foo Street</address>
<work-phone>(123) 123-1234</work-phone>
<home-phone>(123) 123-1234</home-phone>
<email>bob@harris.org</email>

</person>
</addressbook>

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

<?xml version="1.0"?>
<!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Object Mapping DTD Version 1.0//EN" "http://castor.exolab.org/mapping.dtd">

<mapping>
<description>A mapping file for our Address Book application</description>

<class name="Person">
<field name="name" type="string">
<bind-xml name="name" node="attribute" />
</field>
<field name="address" type="string" />
<field name="ssn" type="string" />
<field name="email" type="string" />
<field name="homePhone" type="string" />
<field name="workPhone" type="string" />
</class>

<class name="Addressbook">
<field name="name" type="string">
<bind-xml name="name" node="attribute" />
</field>
<field name="persons" type="Person" collection="collection" />
</class>

</mapping>
§这样,就可以一样很方便的使用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 setName(String name) {
this.addressBookName = name;
}
}



--  作者:凤舞九天
--  发布时间:7/26/2004 2:54:00 PM

--  
察看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 );
}
}
}


--  作者:yu145
--  发布时间:8/18/2004 5:14:00 PM

--  
真是不错啊~~~涉及这个的帖子少啊~~~终于找到了,谢了啊~~~要是能多贴点就好了

————————————————————————————————————
我不是菜鸟!!    我是菜鸟蛋  -_-|||


--  作者:zhangshw
--  发布时间:1/11/2005 6:11:00 PM

--  
我也在学习这个方面,好象学这个的人不多,用他来能生成XML文档吗?多多交流好吗?QQ::122534682
--  作者:zhangshw
--  发布时间:1/11/2005 9:05:00 PM

--  
to:凤舞九天
据我所知,castor可以根据给定的模式文档自动生成一系列的Java类,但我不知道怎么做,不知能否赐教,QQ:122534682
--  作者:bigc
--  发布时间:3/10/2005 10:29:00 AM

--  
刚来,谢了,不知 用jaxb如何使用
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
113.281ms