设计图如下:
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==nullparserType.length()
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);
/**
* 获得