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