首页 > 开发 > Java > 正文

Java对象与XML文件之间相互转化(含源代码)

2024-07-13 09:54:59
字体:
来源:转载
供稿:网友
中国最大的web开发资源网站及技术社区,
要求: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,但文件中没有此元素,不会出错
*/
}
}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表