Java對象與XML文件之間相互轉化(含源代碼)

要求:JDK1.4以上

下載:http://spaner.zj.com
示例:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">


<web-app>
  //  根元素必須對應一個java類,這裏是WebApplicationLabel.java
  //DocumentObject doc = new DocumentObject( "web-app" , WebApplicationLabel.class )
  //  參數"web-app"對應根元素標籤的名稱,以下同
 
  <servlet>
  //  所有包含元素子結點的必須對應一個java類,這裏是ServletLabel.java
  //ElementObject serv=doc.addChild( ElementObject.MULTI , "servlet" ,ServletLabel.class , "servlets" );
  //  在此元素在web-app中可以有0到n個servlet(對應參數ElementObject.MULTI),在WebApplicationLabel.java中
  //必須有一個屬性ServletLabel[] servlets(這裏名稱可自定,對應下一行的最後一個參數)及它的set和get方法
  //  如果在web-app元素中有1到n個servlet元素,則第一個參數是ElementObject.MORETHANONE,並且在WebApplicationLabel.java中
  //必須有一個屬性ServletLabel[] servlets及它的set和get方法
  //  如果在web-app元素中只允許一個servlet元素,則第一個參數是ElementObject.SINGLE,並且在WebApplicationLabel.java中
  //必須有一個屬性ServletLabel servlet及它的set和get方法
  //  如果在web-app元素中有0或1個servlet元素,則第一個參數是ElementObject.OPTIONAL,並且在WebApplicationLabel.java中
  //必須有一個屬性ServletLabel servlet及它的set和get方法
 
    <servlet-name>action</servlet-name>
    //對於這種沒有屬性和元素子結點,只有文本子結點的元素,可以這樣簡單處理
    //serv.addSimpleChild(ElementObject.SINGLE , "servlet-name" , String.class ,"name");
    //此元素是servlet的子結點,所以向serv這個對象添加,而不是向doc中添加,
    //其中第一個參數的處理與servlet元素相同,在ServletLabel.java中有一個屬性String name及它的set和get方法,
    //這個屬性只能是基本數據類型或String,String.class是指它的數據類型,"name"是屬性的名稱,
    //如果是基本數據類型(int,long)等,對應類型是Integer.TYPE,Long.TYPE等,
    //如:addSimpleChild(Element.OPTIONAL,"lable-name",Integer.TYPE,"name");
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    //serv.addSimpleChild(ElementObject.SINGLE,"servlet-class",String.class,"servletClass");
    //同servlet-name
    <init-param>
      <param-name>debug</param-name>
      <param-value>2</param-value>
    </init-param>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <taglib>
    <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
  </taglib>
  <taglib>
    <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
  </taglib>
</web-app>

程序:WebApplicationLabel.java

public class WebApplicationLabel{//必須是public class
  private ServletLabel[] servlets;
  private ServletMapping[] maps;
  private Taglib[] tags;

  public WebApplicationLabel(){}//必須有public類型的無參數構造方法
 
  public void setServlets(ServletLabel[] servlets){
    this.servlets=servlets;
  }
  public ServletLabel[] getServlets(){
    return servlets;
  }
 
  //其它get和set方法未列出,以下同

}

public class ServletLabel{
  private String name;
  private String servletClass;
  private ArrayList params=new ArrayList();
  private int startup;

  public ServletLabel(){}
 
  public void setName(String name){
    this.name=name;
  }
 
  public String getName(){
    return name;
  }
 
  public void setServletClass(String servletClass){
    this.servletClass=servletClass;
  }
 
  public String getServletClass(){
    return servletClass;
  }
 
  public int getStartup(){
    return startup;
  }
  //這裏定義一個整數類型的變量,它是可選的
  public void setStartup(int startup){
    return startup;
  }
 
  public ServletParam[] getParams(){
    ServletParam[] rs=new ServletParam[params.size()];
    return (ServletParam[])params.toArray(rs);
  }
  //注意這裏,實際上不用定義變量ServletParam[] params,只要有get和set方法就行
  public void setParams(ServletParam[] rs){
    for(int i=0;i<rs.length;i++){
      params.add(rs[i]);
    }
  }
 
  public void addParams(ServletParam param){
    params.add(param);
  }
 
}

public class ServletParam{
  private String name;
  private String value;
 
  public ServletParam(){}
  //set和get方法略

}

public class ServletMapping{
  private String name;
  private String url;
 
  public ServletMapping(){}
  //set和get方法略

}

public class Tablib{
  private String uri;
  private String location;
 
  public Tablib(){}
  //set和get方法略

}

以下是測試方法:

注意 :以下並沒有對web.xml文件全面定義,對一般的web.xml文件只能分析出上面列出的結點


public class Test(){
  //使用static變量和塊是爲了加快第二次對xml文件的分析。你可以先加到main方法中進行測試,測試後再copy到static塊
  private static DocumentObject doc=new DocumentObject( "web-app" , WebApplicationLabel.class );//根元素
  static{
    ElementObject serv=doc.addChild( ElementObject.MULTI , "servlet" ,ServletLabel.class , "servlets" );//servlet元素
    serv.addSimpleChild(ElementObject.SINGLE,"servlet-name",String.class,"name");//servlet中的name元素
    serv.addSimpleChild(ElementObject.SINGLE,"servlet-class",String.class,"servletClass");//servlet中的servlet-class元素,注意大小寫
    serv.addSimpleChild(ElementObject.MULTI,"init-param",ServletParam.class,"params");//servlet中的init-param元素,它是0到n個
    serv.addSimpleChild(ElementObject.OPTIONAL,"load-on-startup",Integer.TYPE,"startup");
    //servlet中的load-on-startup元素,它是可選的int型.   
   
    ElementObject map=doc.addChild( ElementObject.MULTI , "servlet-mapping" ,ServletMapping.class , "maps" );
    map.addSimpleChild(ElementObject.SINGLE,"servlet-name",String.class,"name");
    map.addSimpleChild(ElementObject.SINGLE,"url-pattern",String.class,"url");
   
    ElementObject tag=doc.addChild( ElementObject.MULTI , "taglib" ,ServletLabel.class , "servlets" );
    map.addSimpleChild(ElementObject.SINGLE,"taglib-uri",String.class,"uri");
    map.addSimpleChild(ElementObject.SINGLE,"taglib-location",String.class,"location");
   
   
    /*
     
    如果元素servlet有一個或多個屬性,這樣來處理:
      serv.addAttribute ( String label , Class type , String property ,boolean required )
     label是屬性名稱,type是類型(只能是基本類型或String),
     property是它是ServletLabel.java中的屬性名稱,required是指它是否必須的
   
    如果元素servlet中還包含了要處理的文本結點(如:<servlet name="action">org.apache.struts.action.ActionServlet</servlet>)
       serv.addTextProperty ( String textProperty , Class textType ,boolean required )
       textProperty是它在ServletLabel.java中的屬性名稱,type是類型(只能是基本類型或String),required是指它是否必須的
       注意,調用了這個方法將不能再調用方法addSimpleChild和addChild方法,反之亦然。
    */
   
  }

  public static void main(String[] args){
    WebApplicationLabel app=(WebApplicationLabel)doc.read(new File("d:/1.xml"));//讀取文件
   
   
    doc.write(app,new File("d:/2.xml"));//寫入到XML文件
   
    /*
    寫入文件時,如果一個元素
     定義爲ElementObject.SINGLE,但它的對應值爲null,出錯
     定義爲ElementObject.OPTIONAL,但它的對應值爲null,不會出錯
     定義爲ElementObject.MORETHANONE(多於一個),但它的對應值爲null,出錯
     定義爲ElementObject.MULTI,但它的對應值爲null,不會出錯
    讀取文件時,會忽略所有沒有在doc中定義的結點
     定義爲ElementObject.SINGLE,但文件中沒有此元素,出錯
     定義爲ElementObject.OPTIONAL,但文件中沒有此元素,不會出錯
     定義爲ElementObject.MORETHANONE(多於一個),但文件中沒有此元素,出錯
     定義爲ElementObject.MULTI,但文件中沒有此元素,不會出錯
    */
  }
}

發佈了27 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章