XMLParser.class:xml解析器接口。
XMLParserTest.class:xml解析器接口实现子类。
XMLParserFactory.class :xml解析器工厂类。
XMLTool.class :xml工具类接口(对xml文档进行操作)。
XMLToolTest.class :xml工具类接口实现子类。
设计图如下:

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);
/**
* 获得
查看本文来源
XMLToolTest.class实现了对xml文档的操作。包括建立一个新xml document.档结构及内容或从指定xml文件或的document.构和内容,output到指定的xml文件(或更新xml文件),获取和设定指定节点名的指定属性(或属性列表),在指定节点添加子节点、删除子节点、编辑子节点(先删除在添加,待完善),支持在文档中定位(下标定位,和查询定位,如:定位到test节点的 name attribute的value="张治中"的节点,有简单的复合查询定位,暂时是全and的关系. :) ),定位后可以和全面的操作联合使用(有点数据库的影子,和自己想做的应用有关)。后来又根据它做了一个数据库和xml对导的例子。代码如下:
package com.ceic.workflow.xml.Tool;
import com.ceic.workflow.xml.*;
import org.w3c.dom.*;
/**
* Title: XML处理工具的 运算和实现部分的接口
* Description: XML处理工具的 运算和实现部分的接口
* Copyright: Copyright (c) 2003
* Company: 国电信息中心
* @author 张治中
* @version 1.0
* XML处理工具的 运算和实现部分 的接口
* XMLTool的实现子类,其中的XML解析器从XMLParserFactory中获得.
* 没有说明的方法和参数参见XMLTool接口.
*/
public class XMLToolTest implements XMLTool
{
private XMLParser parser;
private String ParserType=
XMLParserFactory.getDefaultType();
private String ParserClassName="";
private int Index=0;
private String markName="";
private document.nbspdoc;
private int DefaultBegin=0;
private String encoding="UTF8";
private String filepath="";
private boolean EnableMakeUp=false;
private String header="";
public XMLToolTest()
{
}
public Object Build(String path, boolean vali)
{
if(path!=null&&path.length() >0){
parser=XMLParserFactory.getXMLParser
(ParserType,ParserClassName);
if(parser!=null){
doc=(document.parser.parse(path,vali);
filepath=path;
return doc;
}
}
return null;
}
public Object Build(String xmlString)
{
if(xmlString!=null&&xmlString.length() >0){
parser=XMLParserFactory.getXMLParser
(ParserType,ParserClassName);
if(parser!=null){
doc=(document.parser.parseString(xmlString);
filepath="";
return doc;
}
}
return null;
}
public void setdocument.ource(document.nbspdocs){
doc=docs;
}
public void setParser(String ParserName, String ClassName)
{
if(ParserName!=null&&ParserName.length() >0){
ParserType=ParserName;
ParserClassName=ClassName;
}
}
public void setProperty(String NodeName,String
propertyName,String value,boolean setall){
try{
NodeList list=doc.getElementsByTagName(NodeName);
if(list.getLength() >0&&value!=null&&value.length()>0)
{
if(setall){
for(int i=0;i
if(propertyName!=null&&propertyName.length()>0)
{
((Element)list.item(i)).setAttribute
(propertyName,value);
}
else{
list.item(i).setNodevalue(value);
}
}
}else{
if(propertyName!=null&&propertyName.length()>0){
if(NodeName.equals(markName)){
((Element)list.item(Index)).setAttribute
(propertyName,value);
}
else{
((Element)list.item(DefaultBegin)).
setAttribute(propertyName,value);
}
}else{
if(NodeName.equals(markName)){
list.item(Index).setNodevalue(value);
}
else{
list.item(DefaultBegin).setNodevalue(value);
}
}
}
}
}catch(Exception ee){
System.out.println("设定"+NodeName+"节点的"+
propertyName+"属性出错");
}
}
public String getProperty(String NodeName,
String propertyName)
{
try{
NodeList list=doc.getElementsByTagName(NodeName);
if(list.getLength() >0){
if(propertyName!=null&&propertyName.length() >0){
if(NodeName.equals(markName)){
return ((Element)list.item(Index)).getAttribute
(propertyName);
}else{
return ((Element)list.item(DefaultBegin)).
getAttribute(propertyName);
}
}else{
if(NodeName.equals(markName)){
return ((Element)list.item(Index)).getNodevalue()
}else{
return ((Element)list.item(DefaultBegin)).
getNodevalue()
}
}
}
return null;
}catch(Exception ee){
System.out.println("getProperty("+NodeName+","+
propertyName+");出错"+ee.getMessage());
return null;
}
}
public String[] getPropertys(String NodeName,
String propertyName)
{
try{
String[] temp;
NodeList list=doc.getElementsByTagName(NodeName);
if(list.getLength() >0){
if(propertyName!=null&&propertyName.length() >0){
temp=new String[list.getLength()];
for(int i=0;i temp[i]=((Element)list.item(i)).
getAttribute(propertyName);
}
return temp;
}else{
temp=new String[list.getLength()];
for(int i=0;i temp[i]=((Element)list.item(i)).getNodevalue()
}
return temp;
}
}
return null;
}catch(Exception ee){
System.out.println("getPropertys("+NodeName+","+
propertyName+");出错");
return null;
}
}
public String getParent(String returnAttr){
String tempreturn="";
String tempnode=markName
int tempindex=Index
NodeList list=doc.getElementsByTagName(markName);
Node node=list.item(Index);
if(returnAttr!=null&&returnAttr.length() >0){
tempreturn=((Element)node.getParentNode()).
getAttribute(returnAttr);
}else{
tempreturn=node.getParentNode().getNodevalue()
}
return tempreturn;
}
public void setFormat(String XMLToolName,
String classname){}
public void addNode(String parent, Node NodeName,
boolean addall)
{
try{
NodeList list=doc.getElementsByTagName(parent);
if(list.getLength() >0){
if(addall){
for(int i=0;i int type=NodeName.getNodeType()
switch(type){
case Node.ATTRIBUTE_NODE: {
((Element)list.item(i)).setAttribute(((Attr)
NodeName).getName() ,((Attr)NodeName).getvalue());
}
default:{
list.item(i).appendChild(NodeName);
查看本文来源
XMLBuilder.class 主要是把指定的document.node对象转换成规范的xml字符串。用的是ibm的xml4j解析器.代码如下:
package com.ceic.workflow.xml;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import org.w3c.dom.Attr;
import org.w3c.dom.document.
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.ibm.xml.parsers.*;
/**
* Title: 有效XML 字符串生成工具
* Description: 有效XML 字符串生成工具
* Copyright: Copyright (c) 2003
* Company: 国电信息中心
* @author 张治中
* @version 1.0
* 有效XML 字符串生成工具
* 例如:
* XmlBuilder build=new XmlBuilder();
* document.nbspdoc=((document.Class.forName("com.ibm.xml.
* dom.document.mpl").newInstance())
* ..........
* build.printDOMTree(doc);
* String xmlString=build.getXmlResult();
* 再把xmlString用XmlOutput类去输出成xml文件.
*/
public class XmlBuilder
{
private String lineSeparator="\r";
private String xmlString="";
private int indentLevel=0;
protected static String STANDARD_INDENT=" ";
private String XmlHeader="<?xml version=\"1.0\" ?>";
private int currentlevel=0;
/**
* 生成XML字符串.
* @param node 要生成字符串的document.其它Node.
*/
public void printDOMTree(Node node){
printDOMTree(node,indentLevel,false);
}
/**
* 生成XML字符串.
* @param node 要生成字符串的document.其它Node.
* @param noTop 是否去除头尾,如果为document.象去掉<?xml.../?>头
*/
public void printDOMTree(Node node,boolean noTop){
printDOMTree(node,indentLevel,noTop);
}
/**
* 生成XML字符串.
* @param node 要生成字符串的document.其它Node.
* @param level 节点的深度.(中间变量)
* @param noTop 是否去除头尾,如果为document.象去掉<?xml.../?>头
*/
private void printDOMTree(Node node,int level,boolean noTop)
{
int templevel=level;
int find=0;
short toptype=0;
String topvalue="";
int type = node.getNodeType();
switch (type)
{
// print the document.nbspelement
case Node.document.NODE:
{
find++;
if(!noTop||find>1){
xmlString+=XmlHeader+lineSeparator;
}else{
toptype=Node.document.NODE;
}
printDOMTree(((document.node).getdocument.lement(),
templevel+1,false);
break;
}
// print element with attributes
case Node.ELEMENT_NODE:
{ find++;
if(!noTop||find>1){
currentlevel=templevel;
xmlString+=printIndent(templevel);
xmlString+=lineSeparator+"<";
xmlString+=node.getNodeName();
NamedNodeMap attrs = node.getAttributes();
for (int i = 0; i < attrs.getLength(); i++)
{
Node attr = attrs.item(i);
xmlString+=" " + attr.getNodeName() +"=\"" +
attr.getNodevalue() +"\"";
}
xmlString+=">"+lineSeparator;
}
else{
toptype=Node.ELEMENT_NODE
topvalue="</"+node.getNodeName()+">"+lineSeparator;
}
NodeList children = node.getChildNodes();
if (children != null)
{
int len = children.getLength();
for (int i = 0; i < len; i++)
printDOMTree(children.item(i),templevel+1,false);
}
break;
}
// handle entity reference nodes
case Node.ENTITY_REFERENCE_NODE:
{
find++;
xmlString+="&";
xmlString+=node.getNodeName();
xmlString+=";";
break;
}
// print cdata sections
case Node.CDATA_SECTION_NODE:
{
find++;
xmlString+="<![CDATA[";
xmlString+=node.getNodevalue();
xmlString+="]]>";
break;
}
// print text
case Node.TEXT_NODE:
{
find++;
// String temp=node.getNodevalue();
// if(!temp.equals(" ")&&!temp.equals("\n")
// &&!temp.equals("\r"))
xmlString+=node.getNodevalue();
break;
}
// print processing instruction
case Node.PROCESSING_INSTRUCTION_NODE:
{
find++;
xmlString+="<?";
xmlString+=node.getNodeName();
String data = node.getNodevalue();
{
xmlString+=" ";
xmlString+=data;
}
xmlString+="?>";
break;
}
}
if (type == Node.ELEMENT_NODE)
{
find++;
if(currentlevel!=templevel){
xmlString+=printIndent(templevel);
xmlString+=lineSeparator;
}
xmlString+="</";
xmlString+=node.getNodeName();
xmlString+=">"+lineSeparator;
}
if(noTop&&toptype==Node.ELEMENT_NODE){
int len=xmlString.length()
int tlen=topvalue.length()
xmlString=xmlString.substring(0,len-tlen);
}
}
/**
* 生成行前的STANDARD_INDENT(一般指空格)
* @param num STANDARD_INDENT的个数
* @return String
*/
private String printIndent(int num){
String temp="";
if(num>0){
for(int i=0;i<num;i++){
temp+=STANDARD_INDENT;
}
}
return temp;
}
/**
* 设定行前的STANDARD_INDENT(一般指空格)
* @param indent STANDARD_INDENT的值
*/
public void setIndent(String indent){
STANDARD_INDENT=indent;
}
/**
* 获得已经生成的xml字符串.在printDOMTree(Node node)方法后有效
* @return String
*/
public String getXmlResult(){
return xmlString;
}
/**
* 设定最开始的深度级别(直接影响行前的STANDARD_INDENT(空格)数)
* @param level 级别数
*/
public void setBeginLevel(int level){
indentLevel=level;
}
/**
* 设定xml文件的xml头
* @param header xml文件xml头。例如:<?xml version=\"1.0\" ?>
*/
public void setXmlHeader(String header){
XmlHeader=header;
}
/**
* 设定换行符 默认为"\r\n"
* @param lineseparator 换行分割符,默认为"\r\n"
*/
public void setlineSeparator(String lineseparator){
lineSeparator=lineseparator;
}
}
XMLOutput.class 功能是用指定的string或InputStream生成文件(不一定是xml文件)。代码如下:
package com.ceic.workflow.xml
import org.w3c.dom.*;
import java.io.*;
import java.util.*;
/**
* Title: 有效XML 字符串生成xml文件的工具
* Description: 有效XML 字符串生成xml文件的工具
* Copyright: Copyright (c) 2003
* Company: 国电信息中心
* @author 张治中
* @version 1.0
*/
public class XmlOutput{
private String objectpath;
pri
查看本文来源