castor应用demo

castor应用demo

它要做到就是把xml到bean的互相转换。
bean中稍微要注意点的地方:
1、bean要有默认的构造方法;
2、持久化的属性要有相应的get/set方法。

还有一个就是根据mapping来定义xml文档的结构,和相应的调整xml格式的方法。

     public   static   void  testMarshal()  throws  Exception{
        Student bean 
=   new  Student(  " Jack "  );

        List
< Teacher >  tcrList  =   new  ArrayList < Teacher > ();
        tcrList.add( 
new  Teacher(  " Miss Z " " History "  ) );
        tcrList.add( 
new  Teacher(  " Miss X " " English "  ) );
        bean.setTcrList( tcrList );

        File file 
=   new  File( FILENAME );
        Writer writer 
=   new  FileWriter( file );
        Marshaller m 
=   new  Marshaller( writer );
        Mapping mapping 
=   new  Mapping();
        mapping.loadMapping( 
" mapping.xml "  );
        m.setMapping( mapping );
        m.setEncoding( 
" utf-8 "  );
        m.marshal( bean );

        
//  1.读取student.xml文件
        String unFormattedXml  =  CastorUtil.readFile( FILENAME );
        
//  2.格式化XML文件
        String formattedXml  =  CastorUtil.formatXML( unFormattedXml );
        
//  3.写入到student.xml文件
        CastorUtil.writeFile( FILENAME, formattedXml,  false false  );
    }

    
public   static   void  testUnmarshal()  throws  Exception{
        File file 
=   new  File( FILENAME );
        Reader reader 
=   new  FileReader( file );
        Mapping mapping 
=   new  Mapping();
        mapping.loadMapping( 
" mapping.xml "  );
        Unmarshaller unmar 
=   new  Unmarshaller( mapping );
        Student bean 
=  (Student)unmar.unmarshal( reader );

        System.out.println( bean.getName() );
        List
< Teacher >  list  =  bean.getTcrList();
        
for ( Teacher t : list ){
            System.out.println( t.getName() 
+   " - "   +  t.getCourse() );
        }
    }

package  com._castor;

import  java.io.BufferedReader;
import  java.io.File;
import  java.io.FileInputStream;
import  java.io.FileOutputStream;
import  java.io.IOException;
import  java.io.InputStreamReader;
import  java.io.OutputStream;
import  java.io.StringReader;
import  java.io.StringWriter;
import  java.io.Writer;

import  javax.xml.parsers.DocumentBuilder;
import  javax.xml.parsers.DocumentBuilderFactory;
import  javax.xml.parsers.ParserConfigurationException;

import  org.apache.xml.serialize.OutputFormat;
import  org.apache.xml.serialize.XMLSerializer;
import  org.w3c.dom.Document;
import  org.xml.sax.InputSource;
import  org.xml.sax.SAXException;

public   class  CastorUtil{

    
private   static  Document parseXMLFile( String in )
                                                        
throws  ParserConfigurationException,
                                                        SAXException,
                                                        IOException{
        DocumentBuilderFactory dbf 
=  DocumentBuilderFactory.newInstance();
        DocumentBuilder db 
=  dbf.newDocumentBuilder();
        InputSource is 
=   new  InputSource(  new  StringReader( in ) );
        
return  db.parse( is );
    }

    
public   static  String formatXML( String unFormattedXml )
                                                            
throws  ParserConfigurationException,
                                                            SAXException,
                                                            IOException{
        
final  Document document  =  parseXMLFile( unFormattedXml );
        OutputFormat format 
=   new  OutputFormat( document );
        format.setIndenting( 
true  );
        format.setLineWidth( 
65  );
        format.setIndent( 
2  );
        format.setEncoding( 
" utf-8 "  );

        Writer out 
=   new  StringWriter();
        XMLSerializer serializer 
=   new  XMLSerializer( out, format );
        serializer.serialize( document );
        
return  out.toString();
    }
    
    
public   static  String readFile( String filePath )  throws  IOException{
        StringBuffer fileContent 
=   new  StringBuffer();
        File file 
=   new  File( filePath );
        
if ( file.isFile()  &&  file.exists() ){
            InputStreamReader read 
=   new  InputStreamReader(  new  FileInputStream( file ),  " utf-8 "  );
            BufferedReader reader 
=   new  BufferedReader( read );
            String line;
            
while ( ( line  =  reader.readLine() )  !=   null  ){
                fileContent.append( line );
            }
            reader.close();
            read.close();
        }
        
return  fileContent.toString();
    }

    
/**
     * 向文件中写入内容
     * 
     * 
@param  filepath
     *            写入文件的文件路径
     * 
@param  write
     *            写入的内容
     * 
@param  flag1
     *            是否覆盖,true-不覆盖原来的内容(追加),false-覆盖原来的内容
     * 
@param  flag2
     *            是否换行,true-换行后写入,false-直接在文件末尾写入
     * 
@throws  IOException
     
*/
    
public   static   void  writeFile(    String filepath,
                                    String str,
                                    
boolean  flag1,
                                    
boolean  flag2 )  throws  IOException{

        
//  1.使用File类找到一个文件
        File file  =   new  File( filepath );

        
//  2.通过子类实例化父类对象
        OutputStream out  =   null ; //  准备好一个输出的对象
        
//  flag1=true,追加;flag1=false,覆盖
        out  =   new  FileOutputStream( file, flag1 ); //  实例化

        
//  3.以循环的方式输出
        String result  =   "" ;
        
if ( flag1 ){
            
if ( flag2 ){
                result 
=   " \n "   +  str;
            }
else {
                result 
=  str;
            }
        }
else {
            result 
=  str;
        }

        
byte  b[]  =  result.getBytes();
        
for int  i  =   0 ; i  <  b.length; i ++  ){
            out.write( b[i] );
        }
        out.close();
    }
}

package  com._castor;

import  java.util.List;

public   class  Student{
    String name;
    List
< Teacher >  tcrList;

    
public  Student(){}

    
public  Student( String name ){
        
this .name  =  name;
    }

    
public  String getName(){
        
return  name;
    }

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

    
public  List < Teacher >  getTcrList(){
        
return  tcrList;
    }

    
public   void  setTcrList( List < Teacher >  tcrList ){
        
this .tcrList  =  tcrList;
    }
}

package  com._castor;

public   class  Teacher{
    String name;
    String course;

    
public  Teacher(){}

    
public  Teacher( String name, String course ){
        
this .name  =  name;
        
this .course  =  course;
    }

    
public  String getName(){
        
return  name;
    }

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

    
public  String getCourse(){
        
return  course;
    }

    
public   void  setCourse( String course ){
        
this .course  =  course;
    }
}

<? 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是这个类的类名,需要指明类的全路径
    Map-to只有根元素对应的类才配置这个属性,指定的值为XML的根元素的名称
    Field 类字段和xml字段之间的映射 filed中的name是对应类中字段的属性名字 TYPE对应的是属性类型
    Bind-xml 是xml文档中对应的字段信息,name、location是生成的XML元素的名称,可以任意指定,建议尽量取得有意义
    node指明是element还是attribute,默认是element
    
-->
    
    
< class  name ="com._castor.Student" >
        
< map-to  xml ="student-info" />
        
< field  name ="name"  type ="java.lang.String" >
            
< bind-xml  name ="studentName"  node ="attribute" />
        
</ field >
        
< field  name ="tcrList"  collection ="arraylist"  type ="com._castor.Teacher" >
            
< bind-xml  name ="teacher" />
        
</ field >
    
</ class >
    
    
< class  name ="com._castor.Teacher" >
        
< field  name ="name"  type ="java.lang.String" >
            
< bind-xml  name ="name"  node ="attribute" />
        
</ field >
        
        
< field  name ="course"  type ="java.lang.String" >
            
< bind-xml  name ="courseName"  node ="element" />
        
</ field >
    
</ class >
    
</ mapping >

你可能感兴趣的:(castor应用demo)