今日笔记系列之Castor

类别:Java 点击:0 评论:0 推荐:

近日对java对象与xml文本的相互转换有一定兴趣,于是乎在网上查看了一下相关的资料。发现了castor。

并浏览了该页面http://www.jdon.com/idea/castor.htm,但发现上面的代码有一些错漏。

自己用eclipse写了一个简单的代码如下:(主要参考了上面提到的网站的内容)

该程序是读入page.xml文件,然后转化为java对象。接着把java对象写到另外一个文件里。

****************************************************************************

1.page.xml,要被转化为对象的页面

<?xml version="1.0" encoding="UTF-8"?>
<homepagecollection name="this is sample">   <!-- 对应Homepagecollection类  -->
 <homepagecontent id="1">   <!-- 对应Homepagecontent 类  -->
  <name>About Us</name>
  <navlink>1.jsp</navlink>
  <icon>images/icon.gif</icon>
  <description>An in-depth look at creating applications with XML.</description>
 </homepagecontent>
 <homepagecontent id="2">   <!-- 对应Homepagecontent 类  -->
  <name>Product|Service</name>
  <navlink>2.jsp</navlink>
  <icon>images/icon.gif</icon>
  <description>let's tak a look at our products.</description>
 </homepagecontent>
</homepagecollection>

****************************************************************************

2.Homepagecontent.java,一个符合JavaBean规格的简单类


package tryForCastor;

public class Homepagecontent implements java.io.Serializable {


    private static final long serialVersionUID = 3689909565688657717L;

    private Integer id;

    private String name;

    private String navlink;
    
    private String icon;

    private String description;

    public Homepagecontent() {
    }

    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 String getNavlink() {
        return navlink;
    }

    public void setNavlink(String navlink) {
        this.navlink = navlink;
    }

    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

****************************************************************************

3.Homepagecollection.java,

package tryForCastor;

import java.util.*;

public class Homepagecollection implements java.io.Serializable {

    private static final long serialVersionUID = 3545239128603309878L;

    private String SiteName;

    private List homepagecontents = new ArrayList();

    public Homepagecollection() {
    }

    // -- manipulate the List of Page objects
    public void addHomePageContent(Homepagecontent homepagecontent) {
        homepagecontents.add(homepagecontent);
    }

    public List getHomepagecontents() {
        return homepagecontents;
    }

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

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

}

****************************************************************************

4.mapping.xml,映射文件,把要转化的xml文件和java类联系起来

<?xml version="1.0" encoding="UTF-8"?>
<mapping>
 <description>a map file for our new template system</description>
 <class name="Homepagecontent">
  <map-to xml="homepagecontent"/>
  <field name="id" type="integer">
   <bind-xml name="id" node="attribute" />
  </field>
  <field name="name" type="string" />
  <field name="navlink" type="string" />
  <field name="icon" type="string" />
  <field name="description" type="string" />
 </class>
 <class name="Homepagecollection">
  <map-to xml="homepagecollection"/>
  <field name="name" type="string">
   <bind-xml name="name" node="attribute" />
  </field>
  <field name="homepagecontents" type="Homepagecontent"
   collection="collection" />
 </class>
</mapping>

****************************************************************************

5.tryCastor.java,执行转化的类


package tryForCastor;

import java.io.FileReader;
import java.io.FileWriter;
import java.util.*;

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

/**
 * @author hbm
 *
 */
public class tryCastor {
    public Mapping mapping;

    public String xmlfile;

    public void HomePageHandle(String mapfile, String xmlfile) throws Exception {
        this.xmlfile = xmlfile;
        try {
            mapping = new Mapping();
            mapping.loadMapping(mapfile); //读入映射文件
        } catch (Exception e) {
            throw new Exception(e.getMessage());
        }

    }

    // -- page.xml中的数据读入Homepagecollection
    public Homepagecollection read() throws Exception {
        Homepagecollection homepages = null;
        try {
            Unmarshaller un = new Unmarshaller(Homepagecollection.class); // xml -> java 专用类
            un.setMapping(mapping);

            FileReader in = new FileReader(xmlfile);
            homepages = (Homepagecollection) un.unmarshal(in); //转换
            in.close();
        } catch (Exception e) {
            throw new Exception(e.getMessage());
        }
        return homepages;
    }

    // hbm add
    public FileWriter write(String outFile, Object obj) throws Exception {
        FileWriter out = new FileWriter(outFile);
        try {
            Marshaller mar = new Marshaller(out);// java-> xml专用类
            mar.setMapping(mapping);
            mar.marshal(obj);
        } catch (Exception e) {
            throw new Exception(e.getMessage());//转换
        }
        return out;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        tryCastor tc = new tryCastor();
        try {
            //从page.xml读入数据并放到对象hcollection 里
            tc.HomePageHandle("mapping.xml", "page.xml");
            Homepagecollection hcollection = tc.read();
            List list = hcollection.getHomepagecontents();
            for (Iterator iter = list.iterator(); iter.hasNext();) {
                Homepagecontent h = (Homepagecontent) iter.next();
                System.out.println(h.getDescription());
                System.out.println(h.getIcon());
                System.out.println(h.getName());
                System.out.println(h.getNavlink());
                System.out.println(h.getName2());
                System.out.println(h.getId());
                System.out.println(h.getClass());
                System.out.println("+++++++++++++++++++++++");
            }
           
            //写到xml文本
            FileWriter fw = tc.write("d.xml", hcollection);
            if (null != fw) {
                fw.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

****************************************************************************

小结:觉得写映射文件(mapping.xml)很麻烦,是否可以用映射来解决自动查找类字段来实现java到xml的转换?

本文地址:http://com.8s8s.com/it/it10672.htm