分享
 
 
 

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

王朝java/jsp·作者佚名  2004-11-18
窄屏简体版  字體: |||超大  

要求: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,但文件中没有此元素,不会出错

*/

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有