学习java&xml心得(2)

4/7/2006来源:Java认证人气:8251

之前内容请参看:好东西大家分享: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\";
}
}