首页 > C风格编程语言 > JAVA编程资料 > java&xml的学习心得
2006
10-08

最近一段时间有空,啃了啃xml和与它相关的东东,做了一些实践性的代码和功能,做完后自己都不怎么满意,不过实践过程到是一个新手的典型例子。所以拿出来让高手指点指点。^_^


由于一直做b/s结构的东西,在加上一个做项目中的遗留问题(tree型角色和tree型权限之间的交互),所以想做一个xml的解决方案。


   当然这个问题的解决必须有对xml文档对象操作的模块的支持。这篇心得主要针对这个问题。


   设计图如下:




   XMLParser.class:xml解析器接口。


   XMLParserTest.class:xml解析器接口实现子类。


   XMLParserFactory.class :x ml解析器工厂类。


   XMLTool.class :x ml工具类接口(对xml文档进行操作)。


   XMLToolTest.class :x ml工具类接口实现子类。


   XMLToolShow.class :{xml工具类接口实现子类(所有方法的实现都是用XMLTool接口的对应方法实现,功能是通过setForm()灵活更换自己的兄弟类(XMLTool)作为 XML处理工具来获得更好的效率和完善。}


   XMLToolFactory.class :x ml工具类工厂类。


   还有两个设计图中没有的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);
/**
* 获得指定节点名的所有节点的指定属性
* @param NodeName 节点名
* @param propertyName attribute名,
* 如果为空,就找出节点的植
* @return String[]
* @roseuid 3ECB3FA50317
*/
public String[] getPropertys(String NodeName,
String propertyName);


/**
* 从XMLToolFactory中获得XMLTool做为对XML文档操作的基础。
* @param XMLToolName – XMLTool在工厂类中的type名。
* @param classname – XMLTool的class名。
* 默认为null或空字符串。
* @roseuid 3ECC1D870379
*/
public void setFormat(String XMLToolName,
String classname);


/**
* 在所有parent节点或指定的parent节点处(具体位置由setMarkSign(),
* setMark()或setMarkAdv()来确定)增加新节点NodeName
* @param parent 要添加子节点的节点的节点名
* @param NodeName 子节点
* @param addall 是否添加所有parent节点
* @roseuid 3ECB40D10250
*/
public void addNode(String parent, Node NodeName,
boolean addall);
/**
* 在所有parent节点或指定的parent节点处(具体位置由setMarkSign(),
* setMark()或setMarkAdv()来确定)删除名为
* NodeName的attribute和子节点
* @param parent 要删除子节点或attribute的节点的节点名
* @param NodeName 要删除的子节点名或attribute名
* @param delall 是否删除所有的NodeName子节点和attribute
*/
public void delNode(String parent,String
NodeName,boolean delall);


/**
* 在所有parent节点或指定的parent节点处(具体位置由setMarkSign(),
* setMark()或setMarkAdv()来确定)
* 把NodeOld的节点替换为NodeNew
* @param parent 要操作的节点的节点名
* @param NodeOld 要替换的节点的节点名
* @param NodeNew 替换成的节点
* @param editAll 是否替换所有的parent的子节点NodeOld到NodeNew
*/
public void editNode(String parent,String NodeOld,
Node NodeNew,boolean editAll);



/**
* 设定xml文档数据的位置(根据数据的坐标位置)
* @param index 坐标
* @return boolean
* @roseuid 3ECB427B0357
*/
public boolean setMark(int index);


/**
* 设定xml文档数据的位置(根据数据的值)
* @param name attribute名,如果为空,就查询节点的值
* @param value 要查询的attribute的值或节点的值
* @return boolean
* @roseuid 3ECB42BB03A9
*/
public boolean setMark(String name,String value);


/**
* 设定setMark()方法所依据的节点名.
* @param NodeName 节点名
* @roseuid 3ECB43820157
*/
public void setMarkSign(String NodeName);


/**
* 设定xml文档数据的位置(根据数据的值,复杂查询)
* @param name attribute名列表,如果为空,就查询节点的值
* @param value 要查询的attribute的值或节点的值的列表
* @param operation 操作算法。 (在XMLToolTest子类中
* 默认为 “and”,只有”and”和”or”两种操作)
* @return boolean
*/
public boolean setMarkAdv(String[] name,String[] value,
String operation);
/**
* 创建一个空的document.象
* @return document. */
public document.nbspCreatedocument.);
/**
* 创建一个空的名为name的Element对象
* @param name Element名
* @return Element
*/
public Element CreateElement(String name);
/**
* 创建一个空的名为name的Comment对象
* @param name Comment名
* @return Comment
*/
public Comment CreateComment(String name);
/**
* 创建一个空的名为name的Text对象
* @param name Text名
* @return Text
*/
public Text CreateText(String name);
/**
* 创建一个空的名为name的Attr对象
* @param name Attr名
* @return Attr
*/
public Attr CreateAttr(String name);
/**
* 根据操作过的document.XMLTool类的内部
* document.)生成xml文件.
* @param path xml文件位置
*/
public void Output(String path);
/**
* 根据操作过的document.XMLTool类的内部document.)
* 把build()方法指定的xml文件重写.
*/
public void Output();
/**
* 设定生成xml文件的编码
* @param encod 编码,如: “UTF8″ “GBK”
*/
public void setEncoding(String encod);
/**
* 根据指定的Node对象生成xml文件.
* @param path xml文件位置
* @param docu 指定的Node对象
*/
public void Output(String path,Node docu);
/**
* 根据指定的Node对象生成xml文件.
* @param path xml文件位置
* @param docu 指定的Node对象
* @param noTop 是否去掉头尾节点名。如去掉
* 或去掉最上层
* 和
*/
public void Output(String path,Node docu,boolean noTop);
/**
* 根据指定的Node节点名生成xml文件.
* @param path xml文件位置
* @param NodeName 指定的Node节点名
* @param noTop 是否去掉头尾节点名。如去掉
* 或去掉
* 最上层 和
*/
public void Output(String path,String NodeName,
boolean noTop);
/**
* 根据指定的Node节点名生成xml文件.
* @param path xml文件位置
* @param NodeName 指定的Node节点名
* @param indexs NodeName节点的位置
* @param noTop 是否去掉头尾节点名。如去掉
* 或去掉最上层
* 和
*/
public void Output(String path,String NodeName,
int indexs,boolean noTop);
/**
* 设定生成xml文件时自动添加换行和空格.(如果Docment是
* 由xml文件生成的,一般已经有空格和换行的空节点)
* 就不用在去添加空格和换行)
*/
public void isEnableMakeUp();
/**
* 设定生成xml文件时不自动添加换行和空格.(如果Docment是
* 由xml文件生成的,一般已经有空格和换行的空节点)
* 就不用在去添加空格和换行),默认为这种情况。
* 主要用与XMLTool处理多次xml文档时的开关。
*/
public void isNotEnableMakeUp();
/**
* 获得当前做标记的节点名
* @return String
*/
public String getCurrentNodeName();
/**
* 获得当前做标记的节点名的位置编号。
* @return int
*/
public int getIndex();
/**
* 获得当前XMLTool中的document.
* @return document. */
public document.nbspgetdocument.ource();
/**
* 设定写xml文件时xml的头
*/
public void setHeader(String Header);


之前内容请参看:好东西大家分享:java&xml的学习心得(1)
   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);
}
}
}
}else{
if(parent.equals(markName)){
int type=NodeName.getNodeType()
switch(type){
case Node.ATTRIBUTE_NODE: {
((Element)list.item(Index)).setAttribute
(((Attr)NodeName).getName() ,((Attr)NodeName).getvalue());
}
default:{
list.item(Index).appendChild(NodeName);
}
}
}else{


int type=NodeName.getNodeType()
switch(type){
case Node.ATTRIBUTE_NODE: {
((Element)list.item(DefaultBegin)).
setAttribute(((Attr)NodeName).getName() ,
((Attr)NodeName).getvalue());
}
default:{
list.item(DefaultBegin).appendChild(NodeName);
}
}


}
}


}
}catch(Exception e){
System.out.println(“增加节点出错”);
}
}
public void delNode(String parent,String NodeName,
boolean delall)
{
try{
NodeList list=doc.getElementsByTagName(parent);
if(list.getLength() >0){
if(delall){
for(int i=0;i
try{
((Element)list.item(i)).removeAttribute(NodeName);
}catch(Exception ee){}


NodeList tlist=list.item(i).getChildNodes()
if(tlist.getLength() >0){
for(int k=0;k
if(NodeName.equals(tlist.item(k).getNodeName())){
short type=tlist.item(k).getNodeType()
if(type==Node.ATTRIBUTE_NODE){
((Element)list.item(i)).removeAttribute
(NodeName);
}
else list.item(i).removeChild(tlist.item(k));
break;
}
}
}


}
}else{
if(parent.equals(markName)){
try{
((Element)list.item(Index)).removeAttribute(NodeName);
}catch(Exception ee){}


NodeList tlist=list.item(Index).getChildNodes()
if(tlist.getLength() >0){
for(int k=0;k
if(NodeName.equals(tlist.item(k).
getNodeName())){
short type=tlist.item(Index).getNodeType()
if(type==Node.ATTRIBUTE_NODE){
((Element)list.item(Index)).
removeAttribute(NodeName);
}
else list.item(Index).removeChild
(tlist.item(k));
break;
}
}
}
}else{
try{
((Element)list.item(DefaultBegin)).removeAttribute
(NodeName);
}catch(Exception ee){}


NodeList tlist=list.item(DefaultBegin).
getChildNodes()
if(tlist.getLength() >0){
for(int k=0;k
if(NodeName.equals(tlist.item(k).
getNodeName())){
short type=tlist.item(Index).
getNodeType()
if(type==Node.ATTRIBUTE_NODE){
((Element)list.item(DefaultBegin)).
removeAttribute(NodeName);
}
else list.item(DefaultBegin).
removeChild(tlist.item(k));
break;
}
}
}


}
}
}
}catch(Exception e){
System.out.println(“删除节点出错”);
}
}
public void editNode(String parent,String NodeOld,
Node NodeNew,boolean editAll)
{
try{
NodeList list=doc.getElementsByTagName(parent);


if(list.getLength() >0){
if(editAll){
for(int i=0;i
NodeList tlist=list.item(i).getChildNodes()
if(tlist.getLength() >0){
for(int k=0;k
if(NodeOld.equals(tlist.item(k).getNodeName())){
list.item(i).replaceChild(tlist.item(k),NodeNew);
break;
}
}
}
}
}else{
if(parent.equals(markName)){
NodeList tlist=list.item(Index).getChildNodes()
if(tlist.getLength() >0){
for(int k=0;k
if(NodeOld.equals(tlist.item(k).getNodeName())){
list.item(Index).replaceChild(tlist.item(k),
NodeNew);
break;
}
}
}


}else{



NodeList tlist=list.item(DefaultBegin).
getChildNodes()
if(tlist.getLength() >0){
for(int k=0;k
if(NodeOld.equals(tlist.item(k).getNodeName())){
list.item(DefaultBegin).replaceChild
(tlist.item(k),NodeNew);
break;
}
}
}



}
}
}
}catch(Exception e){
System.out.println(“替换节点出错”);
}
}
public boolean setMark(int index)
{
NodeList list=doc.getElementsByTagName(markName);
if(list.getLength() >0&&index<=list.getLength()-
1&&index>=0 ) {
Index=index;
return true;
}
return false;
}



public boolean setMark(String name,String value)
{
if(value!=null&&value.length() >0){
try{
int i=0;
NodeList list=doc.getElementsByTagName(markName);
boolean attrs=false;
boolean find=false;
if(name!=null&&name.length() >0) attrs=true;
if(list.getLength() >0){
for(i=0;i
if(attrs){
if(value.equals(((Element)list.item(i)).
getAttribute(name))){
find=true;
break;
}
}
else{
if(value.equals(list.item(i).getNodevalue())){
find=true;
break;
}
}
}
if(find){
Index=i;
return true;
}else{
return false;
}
}
}catch(Exception e){
System.out.println(“setMark(String name,
String value)无效”);
return false;
}
}
return false;
}
public boolean setMarkAdv(String[] name,String[] value,
String operation){
int tempindex=Index;
try{
if(name!=null&&name.length >0&&value!=null&&value.
length >0&&name.length ==value.length){
if(operation==null||operation.length() ==0)
operation =”and”;
if(!operation.equals(“and”)&&!operation.equals(“or”))
operation=”and”;
if(operation.equals(“and”)){
boolean find=true;
int[] results=new int[name.length];
for(int i=0;i
if(setMark(name[i],value[i])){
results[i]=Index
if(i>0){
if(results[i]!=results[i-1]){
find=false;
break;
}
}
}else{
find=false;
break;
}
}
if(find){
return true;
}else{
Index=tempindex;
return false;
}
}else{
boolean thefind=false;
for(int j=0;j
if(setMark(name[j],value[j])){
thefind=true;
break;
}
}
if(thefind){
return true;
}else{
return false;
}
}
}


return false;
}catch(Exception ex){
System.out.println(“setMarkAdv(String[] name,
String[] value,String operation)出错:”+ex.getMessage());
Index=tempindex;
return false;
}
}
public void setMarkSign(String NodeName)
{
markName=NodeName;
}
public document.nbspCreatedocument.){
try{
document.nbspnode=((document.Class.forName
(“com.ibm.xml.dom.document.mpl”).newInstance())
return node;


}catch(Exception ex){
System.out.print(“找不到com.ibm.xml.dom.document.mpl”);
return null;
}
}
public Element CreateElement(String name){
return doc.createElement(name);
}
public Comment CreateComment(String name){
return doc.createComment(name);
}
public Text CreateText(String name){
return doc.createTextNode(name);
}
public Attr CreateAttr(String name){
return doc.createAttribute(name)
}
public void Output(String path){
Output(path,encoding,doc,false);
}
public void Output(){
Output(filepath,encoding,doc,false);
}
public void setEncoding(String encod){
encoding=encod;
}
public void isEnableMakeUp(){
EnableMakeUp=true;
}
public void isNotEnableMakeUp(){
EnableMakeUp=false;
}
public void Output(String path,Node docu){
Output(path,encoding,docu,false);
}
public void Output(String path,Node docu,boolean noTop){
Output(path,encoding,docu,noTop);
}
public void Output(String path,String NodeName,
boolean noTop){
NodeList list=doc.getElementsByTagName(NodeName);
Node tempnode;
if(list.getLength() >0){
if(NodeName.equals(markName)){
tempnode=list.item(getIndex());
}else{
tempnode=list.item(DefaultBegin);
}
Output(path,encoding,tempnode,noTop);
}
}
public void Output(String path,String NodeName,
int indexs,boolean noTop){
NodeList list=doc.getElementsByTagName(NodeName);
Node tempnode;
if(list.getLength() >0){
if(indexs<=list.getLength() -1){
tempnode=list.item(indexs);
}
else{
if(NodeName.equals(markName)){
tempnode=list.item(getIndex());
}else{
tempnode=list.item(DefaultBegin);
}
}
Output(path,encoding,tempnode,noTop);
}
}
private void Output(String path,String encod,
Node docu,boolean noTop){
try{
if(path!=null&&path.length()>0){
filepath=path;
}
if(encod!=null&&encod.length() >0){
encoding =encod;
}
XmlBuilder builder=new XmlBuilder();
if(!EnableMakeUp){
builder.setIndent(“”);
builder.setlineSeparator(“”);
}
builder.setXmlHeader(header);
builder.printDOMTree(docu,noTop);


String result=builder.getXmlResult()


XmlOutput out=new XmlOutput(filepath);
out.setEncoding(encoding);
out.Output(result);
}catch(Exception ee){
System.out.println(ee.getMessage());
System.out.println(“写入Xml文件:”+filepath+” 出错”);
}
}
public int getIndex(){
return Index;
}
public String getCurrentNodeName(){
return markName
}
public document.nbspgetdocument.ource(){
return doc
}
public void setHeader(String Header){
if(Header!=null&&Header.length() >0){
header=Header;
}
}
}
   XMLToolFactory.class 代码如下:


package com.ceic.workflow.xml;


import com.ceic.workflow.xml.Tool.XMLToolTest;
import java.util.*;
/**
* XMLTool的工厂类。为其它类提供XML处理工具的 运算和实现部分的类。
*/
public class XMLToolFactory
{
private static Hashtable table;
private static String defaultType;
private static String ower;
/**
* @roseuid 3ECC2FC101BF
*/
private XMLToolFactory()
{


}
/**
* 获得一个常用XMLTool.
* @return com.ceic.workflow.xml.XMLTool
* @roseuid 3ECC2243019B
*/
public static XMLTool getXMLTool()
{
try{
return ((XMLTool)Class.forName(table.get(ower).
toString()).newInstance());
}catch(Exception ee){
System.out.println(“获得常用XMLTool出错”);
return null;
}
}
/**
* 获得一个XMLTool.通过参数获得XMLTool的一个实现子类.
* @param type – XMLTool已实现子类在XMLToolFactory中的type名
* @param classname –
* XMLTool实现子类的class名(包含package名),
* 如com.ceic.workflow.xml.tool.XMLToolTest
* .默认为null或空字符串。
* @return com.ceic.workflow.xml.XMLTool
* @roseuid 3ECC2243019B
*/
public static XMLTool getXMLTool(String type,
String classname)
{
try{
if(type==null||type.length() <=0){
type=defaultType;
}
if(table.containsKey(type)){
return ((XMLTool)Class.forName(table.get(type).
toString()).newInstance());
}
if(classname!=null&&classname.length() >0){
try{
XMLTool temp=((XMLTool)Class.forName(classname).
newInstance());
if(type!=null&&type.length() >0){
table.put(type,classname);
}
return temp;
}catch(Exception ee){
System.out.println(ee.getMessage() );
System.out.println(“指定的XMLTool不存在”);
return null;
}
}
return null;
}catch(Exception e){
System.out.println(e.getMessage() );
System.out.println(“指定的XMLTool不存在”);
return null;
}
}
public static String getDefaultType(){
return defaultType;
}


static
{
table=new Hashtable();
table.put(“test”,”com.ceic.workflow.xml.Tool.
XMLToolTest”);
table.put(“show”,”com.ceic.workflow.xml.Tool.
XMLToolShow”);
defaultType=”test”;
ower=”show”;
}
}


java&xml的学习心得》有 1 条评论

  1. hiroki 说:

    感谢楼主啊

留下一个回复