设计图如下:

xmlparser.class:xml解析器接口。
xmlparsertest.class:xml解析器接口实现子类。
xmlparserfactory.class :xml解析器工厂类。
xmltool.class :xml工具类接口(对xml文档进行操作)。
xmltooltest.class :xml工具类接口实现子类。
xmltoolshow.class :{xml工具类接口实现子类(所有方法的实现都是用xmltool接口的对应方法实现,功能是通过setform()灵活更换自己的兄弟类(xmltool)作为 xml处理工具来获得更好的效率和完善。}
xmltoolfactory.class :xml工具类工厂类。
还有两个设计图中没有的class:
xmlbuilder.class :根据指定的document.node生成规范的xml字符串。
xmloutput.class :根据指定的xml字符串或inputstream生成指定的xml文件。
我在 xmlparsertest.class用到的是xml4j解析器.代码如下:
package com.ceic.workflow.xml.parser;
import com.ceic.workflow.xml.xmlparser;
import com.ibm.xml.parsers.*;
import java.io.*;
import org.xml.sax.inputsource;
/**
* xml解析器test
* title: xml解析器test
* description: xml解析器test
* copyright: copyright (c) 2003
* company: 国电信息中心
* @author 张治中
* @version 1.0
*/
public class xmlparsertest implements xmlparser
{
public xmlparsertest()
{
}
/**
* 解析path位置的xml文件
* @param path 文件位置
* @param vali 备用参数
* @return object
* @roseuid 3ecc2fc10043
*/
public object parse(string path, boolean vali)
{
if(path!=null&&path.length()>0){
try{
domparser parser = new domparser();
parser.parse(path);
return parser.getdocument.)
}catch(exception e){
system.out.println("xmlparsertest.parse(/""
+path+"/","+vali+")出错"+e.getmessage());
return null;
}
}
return null;
}
/**
* 解析xmlstring字符串
* @param xmlstring xml字符串
* @return object
* @roseuid 3ecc2fc10043
*/
public object parsestring(string xmlstring)
{
if(xmlstring!=null&&xmlstring.length()>0){
try{
domparser parser = new domparser();
stringreader rd=new stringreader(xmlstring);
inputsource in=new inputsource(rd);
parser.parse(in);
return parser.getdocument.)
}catch(exception e){
system.out.println("xmlparsertest.parsestring
(/""+xmlstring+"/")出错"+e.getmessage());
return null;}
}
return null;
}
}
xmlparserfactory.class用普通手动注册方式。高手可以指点一下好的解决方法。代码如下:
package com.ceic.workflow.xml;
import com.ceic.workflow.xml.parser.xmlparsertest;
import java.util.*;
/**
* xml解析器工厂
*/
public class xmlparserfactory
{
private static hashtable table;
private static string defaulttype;
private xmlparserfactory()
{
}
/**
* 获得xml解析器
* @param parsertype xml解析器类型
* @param parserclassname xml解析器类名
* @return com.ceic.workflow.xml.xmlparser
* @roseuid 3ecb39e30029
*/
public static xmlparser getxmlparser
(string parsertype, string parserclassname)
{
try{
if(parsertype==null||parsertype.length() <=0){
parsertype=defaulttype;
}
if(table.containskey(parsertype)){
return ((xmlparser)class.forname(table.
get(parsertype).tostring()).newinstance());
}
if(parserclassname!=null&&parserclassname.length() >0){
try{
xmlparser temp=((xmlparser)class.
forname(parserclassname).newinstance());
if(parsertype!=null&&parsertype.length() >0){
table.put(parsertype,parserclassname);
}
return temp;
}catch(exception ee){
system.out.println(ee.getmessage() );
system.out.println("指定的xml解析器不存在");
return null;
}
}
return null;
}catch(exception e){
system.out.println(e.getmessage() );
system.out.println("指定的xml解析器不存在");
return null;
}
}
public static string getdefaulttype(){
return defaulttype;
}
static
{
table=new hashtable();
table.put("dom","com.ceic.workflow.xml.
parser.xmlparsertest");
defaulttype="dom";
}
}
其中getxmlparser(string parsertype, string parserclassname)如果是调用已知(已注册)xmlparser,第2个参数可以是null或""
接口 xmltool.class是主要的外界操作界面。代码如下:
package com.ceic.workflow.xml;
import org.w3c.dom.*;
/**
* title: xml处理工具的 运算和实现部分 的接口
* description: xml处理工具的 运算和实现部分 的接口
* copyright: copyright (c) 2003
* company: 国电信息中心
* @author 张治中
* @version 1.0
* xml处理工具的 运算和实现部分 的接口
*/
public interface xmltool
{
/**
* 通过解析器把指定的xml文件解析生成java对象。
* 例如org.w3c.dom.document.
* @param path - xml文件路径(包括文件名).
* @param vali - 备用参数。和xmlparser中的parse
* (string path,boolean vali)对应。默认为false.
* @return object
* @roseuid 3ecc1eab0007
*/
public object build(string path, boolean vali);
/**
* 通过解析器把指定的xml字符串解析生成java对象。
* 例如org.w3c.dom.document.
* @param xmlstring xml字符串
* @return object
* @roseuid 3ecc1eab0007
*/
public object build(string xmlstring);
/**
* 设定document.
* @param docs -document.
*/
public void setdocument.ource(document.nbspdocs);
/**
* 设定xml解析器,各个解析器差别较大,
* 建议在class中固化解析器.
* @param parsername - 解析器名称
* @param classname -
* 解析器class名,如果是已知解析器(xmlparserfactory中固化的),
* 可以传null或空字符串
* @roseuid 3ecc1eba0366
*/
public void setparser(string parsername,
string classname);
/**
* 设定指定节点的单个属性
* @param nodename 节点名
* @param propertyname attribute名,
* 如果为空则指定nodename节点的节点值
* @param value attribute或节点的值
* @param setall 是否全部的节点都更新
* @roseuid 3ecb3fa50317
*/
public void setproperty(string nodename,string
propertyname,string value,boolean setall);
/**
* 获得指定节点的单个属性
* @param nodename 节点名
* @param propertyname attribute名,
* 如果为空,就找出节点的值
* @return string
* @roseuid 3ecb3fa50317
*/
public string getproperty(string nodename,
string propertyname);
/**
* 获得
闽公网安备 35060202000074号