java操作XML实例代码
最近一直在做高效平台的框架,其实意识到我要做一个简单的框架的时候是在我已经做完我认为的一版界面之后,开始以为我要做的是一个可配置的首页展示,但是吭哧吭哧做了两个星期,大概功能实现了之后,才发现要做的不是这个,哎,需求不清楚害死人啊,但是这两个星期并没有白白浪费,也从中学到了很多东西,下面主要介绍读取XML。
在做系统的时候,经常会遇到读取xml的需求,一开始是读取,于是我上网开始查询读取,接着查询删除,接着查询修改,当把这些代码查的差不多的时候,我发现,我为什么不把这些的操作都封装到一个类里,使用的时候直接调用,岂不是更好,感觉之前脑袋都秀逗了,分别查了那么多,还一个个的调试,抱着这个心态继续上网查(因为我真心感觉网上肯定有,如果我自己封装的话脑袋就真的进水了)。
源代码展示:
packagecom.gxpt.struts2;
importjava.io.File;
importjava.io.FileWriter;
importjava.util.Iterator;
importjava.util.List;
importjava.util.Map;
importorg.dom4j.Attribute;
importorg.dom4j.Document;
importorg.dom4j.DocumentException;
importorg.dom4j.DocumentHelper;
importorg.dom4j.Element;
importorg.dom4j.io.OutputFormat;
importorg.dom4j.io.SAXReader;
importorg.dom4j.io.XMLWriter;
publicclasstestAddDeleteXML{
privateDocumentdocument;
privateStringfilePath;//文件所在的实际物理路径
//privateWriteLogwritelog;
publicstaticvoidmain(String[]args)throwsDocumentException{
//Stringfilepath=System.getProperty("user.dir")+"/XmlFiles/LocalServicesConfig.xml";
Stringfilepath="F:\\JAVA项目\\高校平台\\demo\\gxpt\\WebContent\\limits\\manager.txt";
testAddDeleteXMLoperator=newtestAddDeleteXML(filepath);
operator.getXmlFile();
// Mapmap=newHashMap();
// map.put("id","m1");
// map.put("name","module1");
// map.put("url","index1.jsp");
// operator.addChild("div","div9","module","",map);
//operator.updateChild("style","","div","asdfasdf",1);
operator.deleteChildOne("style","","div","div11");
//operator.deleteChild("div","div9","module");
//Stringstr=operator.getChild("div","div8","module");
//System.out.println(str);
//Elementroot=document.getRootElement();//获取根节点名称
}
public testAddDeleteXML(Stringfilepath){
this.document=null;
this.filePath=filepath;
//writelog=newWriteLog();
}
/**
*创建XML文件
*@paramrootName:根节点名称
*/
publicvoidcreateXMLFile(StringrootName){
if(!fileExist()){
this.document=DocumentHelper.createDocument();
this.document.addElement(rootName);
saveXMLFile(this.document);
}
}
/**
*获取已存在的XML文档
*@return
*/
publicDocumentgetXmlFile(){
if(fileExist()){
SAXReaderreader=newSAXReader();
try{
this.document=reader.read(newFile(filePath));
}catch(DocumentExceptione){
// Stringloginfo=StackTraceToString.getExceptionTrace(e);
// writelog.writeLogToEnd("LocalServerManager",loginfo);
}finally{
reader=null;
}
}else{
//写日志
//Stringloginfo="XMLfiledoesnotexist,readerror!";
// writelog.writeLogToEnd("LocalServerManager",loginfo);
System.exit(0);
}
returnthis.document;
}
/**
*添加元素
*@paramfatherPath:父节点名称
*@paramfatherattr:父节点属性
*@paramchildName:要添加的节点名称
*@paramchildValue:要添加的节点值
*/
publicvoidaddChild(StringfatherNode,StringfatherAttr,StringchildName,StringchildValue,MapmapAttr){
ChildOperator(fatherNode,fatherAttr,childName,childValue,"add",mapAttr,0);
}
/**
*修改元素
*@paramfatherPath:父节点名称
*@paramfatherattr:父节点属性
*@paramchildName:要修改的节点名称
*@paramchildValue:要修改成的节点值
*/
publicvoidupdateChild(StringfatherNode,StringfatherAttr,StringchildName,StringchildValue,intupdatId){
ChildOperator(fatherNode,fatherAttr,childName,childValue,"update",null,updatId);
}
/**
*删除元素
*@paramfatherPath:父节点名称
*@paramfatherattr:父节点属性
*@paramchildName:要删除的节点名称
*/
publicvoiddeleteChild(StringfatherNode,StringfatherAttr,StringchildName){
ChildOperator(fatherNode,fatherAttr,childName,"","delete",null,0);
}
/**
*删除元素
*@paramfatherPath:父节点名称
*@paramfatherattr:父节点属性
*@paramchildName:要删除的节点名称
*/
publicvoiddeleteChildAll(StringfatherNode,StringfatherAttr,StringchildName){
ChildOperator(fatherNode,fatherAttr,childName,"","deleteAll",null,0);
}
/**
*删除某个元素
*@paramfatherPath:父节点名称
*@paramfatherattr:父节点属性
*@paramchildName:要删除的节点名称
*/
publicvoiddeleteChildOne(StringfatherNode,StringfatherAttr,StringchildName,StringchildValue){
ChildOperator(fatherNode,fatherAttr,childName,childValue,"deleteOne",null,0);
}
/**
*获取某个元素数值
*@paramfatherPath:父节点名称
*@paramfatherattr:父节点属性
*@paramchildName:要删除的节点名称
*/
publicStringgetChild(StringfatherNode,StringfatherAttr,StringchildName){
Stringresult="";
result=ChildOperator(fatherNode,fatherAttr,childName,"","get",null,0);
returnresult;
}
/**
*子节点操作
*@paramfatherNode:父节点名称
*@paramfatherAttr:父节点属性
*@paramchildName:要修改的节点
*@paramchildValue:修改后的节点值
*@paramoperator:要执行的操作名称
*/
privatesynchronizedStringChildOperator(StringfatherNode,StringfatherAttr,StringchildName,StringchildValue,Stringoperator,MapmapAttr,intupdateId){
Stringresult="";
if(this.document==null){
return"null";
}
Elementroot=this.document.getRootElement();//获取根节点名称
if(!root.getName().equals(fatherNode)){//如果不是在根节点下添加
result=XmlElementOperator(root,fatherNode,fatherAttr,childName,childValue,operator,mapAttr);
}else{
if(operator.equals("add")){
Elementchildelement=root.addElement(childName);//根节点不存在元素属性值
childelement.setAttributeValue("id",childValue);
saveXMLFile(this.document);
}elseif(operator.equals("update")){
Listchildelements=root.elements(childName);
//for(Iteratorchilds=childelements.iterator();childs.hasNext();){
// Elementeveryone=(Element)childs.next();
// everyone.setText(childValue);//修改该元素值
// everyone.setAttributeValue("id",childValue);
Elementeveryone=(Element)childelements.get(updateId);
everyone.setAttributeValue("id",childValue);
// }
saveXMLFile(this.document);
}elseif(operator.equals("delete")){
Listchildelements=root.elements(childName);//获取当前节点下的所有子节点,判断其值,以进行修改
for(Iteratorchilds=childelements.iterator();childs.hasNext();){
Elementeveryone=(Element)childs.next();
Listchildelements1=everyone.elements("module");
for(Iteratorchilds1=childelements1.iterator();childs1.hasNext();){
Elementeveryone1=(Element)childs1.next();
everyone.remove(everyone1);
}
}
saveXMLFile(this.document);
}elseif(operator.equals("get")){
Listchildelements=root.elements(childName);//获取当前节点下的所有子节点,判断其值,以进行修改
for(Iteratorchilds=childelements.iterator();childs.hasNext();){
Elementeveryone=(Element)childs.next();
result=everyone.getText();
}
saveXMLFile(this.document);
}elseif(operator.equals("deleteOne")){
Listchildelements=root.elements(childName);//获取当前节点下的所有子节点,判断其值,以进行修改
for(Iteratorchilds=childelements.iterator();childs.hasNext();){
Elementeveryone=(Element)childs.next();
String divElement=everyone.attributeValue("id");
if(divElement.equals(childValue)){
root.remove(everyone);
}
}
saveXMLFile(this.document);
}elseif(operator.equals("deleteAll")){
Listchildelements=root.elements();//获取当前节点下的所有子节点,判断其值,以进行修改
for(Iteratorchilds=childelements.iterator();childs.hasNext();){
Elementeveryone=(Element)childs.next();
ListchildeDiv=everyone.elements();
for(IteratorchildsDiv=childeDiv.iterator();childsDiv.hasNext();){
ElementeveryoneDiv=(Element)childsDiv.next();
everyone.remove(everyoneDiv);
}
}
}
saveXMLFile(this.document);
}
returnresult;
}
/**
*递归元素操作
*@paramelement:要递归的元素
*@paramfatherNode:父节点名称
*@paramfatherAttr:父节点属性
*@paramchildName:要进行操作的节点
*@paramchildValue:操作后的节点值
*@paramoperator:要执行的操作名称
*/
privatesynchronizedStringXmlElementOperator(Elementelement,StringfatherNode,StringfatherAttr,StringchildName,StringchildValue,Stringoperator,MapmapAttr){
Stringresult="";
Listelements=element.elements();
for(Iteratorit=elements.iterator();it.hasNext();){
Elementcurrentelement=(Element)it.next();
if(!currentelement.getName().equals(fatherNode)){//当前元素并不是我们要查找的父元素时,继续查找
XmlElementOperator(currentelement,fatherNode,fatherAttr,childName,childValue,operator,mapAttr);//递归调用
}else{
if(currentelement.attributeCount()>0){//当前元素存在属性值时
for(Iteratorlist=currentelement.attributeIterator();list.hasNext();){//遍历属性值
Attributeattr=(Attribute)list.next();//获取属性值队列中的第一个元素
if(attr.getValue().equals(fatherAttr)){//根据属性值确定惟一的父元素
if(operator.equals("add")){//添加元素
Elementchildelement=currentelement.addElement(childName);//给当前元素添加一个子元素
childelement.setText(childValue);//设置子元素的数值
IteratoritmapAttr=mapAttr.keySet().iterator();
while(itmapAttr.hasNext()){
Stringkey=(String)itmapAttr.next();
Stringvalue=mapAttr.get(key).toString();
childelement.setAttributeValue(key,value);
}
// childelement.setAttributeValue("id","m1");
// childelement.setAttributeValue("name","module1");
// childelement.setAttributeValue("url","index1.jsp");
}elseif(operator.equals("update")){//修改某个元素
Listchildelements=currentelement.elements(childName);//获取当前节点下的所有子节点,判断其值,以进行修改
for(Iteratorchilds=childelements.iterator();childs.hasNext();){
Elementeveryone=(Element)childs.next();
everyone.setText(childValue);//修改该元素值
}
}elseif(operator.equals("delete")){//删除某个指定的元素
Listchildelements=currentelement.elements();//获取当前节点下的所有子节点,判断其值,以进行修改
for(Iteratorchilds=childelements.iterator();childs.hasNext();){
Elementeveryone=(Element)childs.next();
currentelement.remove(everyone);
}
}elseif(operator.equals("get")){
Listchildelements=currentelement.elements(childName);//获取当前节点下的所有子节点,判断其值,以进行修改
for(Iteratorchilds=childelements.iterator();childs.hasNext();){
Elementeveryone=(Element)childs.next();
// result=everyone.getText();
result=everyone.attributeValue("id")+","+result;
}
}
else{
//写日志
// Stringloginfo="XmlFileOperatornotexists!";
// writelog.writeLogToEnd("LocalServerManager",loginfo);
}
}
}
}
}
}
saveXMLFile(this.document);
returnresult;
}
/**
*保存XML文件
*@paramdocument:XML文件名
*/
privatevoidsaveXMLFile(Documentdocument){
try{
OutputFormatformat=OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriterwriter=newXMLWriter(newFileWriter(newFile(filePath)),format);
writer.write(document);
writer.close();
}catch(Exceptione){
//Stringloginfo=StackTraceToString.getExceptionTrace(e);
//writelog.writeLogToEnd("LocalServerManager",loginfo);
}
}
/**
*判断XML文件是否存在.
*@paramfileName
*@return
*/
privatebooleanfileExist(){
java.io.FileobjFile=newjava.io.File(this.filePath);
if(objFile.exists()){
returntrue;
}else{
returnfalse;
}
}
}
XML文件:
<?xmlversion="1.0"encoding="utf-8"?>
<style>
<divid="div8">
<moduleid="m1"name="module1"url="index1.jsp"/>
<moduleid="m2"name="module2"url="index2.jsp"/>
<moduleid="m3"name="module3"url="index3.jsp"/>
</div>
<divid="div9">
<moduleid="m9"name="module9"url="index3.jsp"/>
<moduleid="m10"name="module10"url="index4.jsp"/>
<moduleid="m11"name="module11"url="index5.jsp"/>
</div>
</style>
解析:这里应用递归的方式来判断是对跟节点还是子节点的操作,相对比较清晰,这里用的是if判断来判断选择的是那种操作,如果变动相对较多,我感觉可以利用依赖注入,省去了if判断的麻烦,但是当时只是做了一个demo,没有更多的优化,如果有兴趣的话可以试一试。
总结:读取XML其实并不难,在写.NET系统的时候就写过关于xml的读取,但是当时真的就是一个一个的写,需要什么在哪个方法下写什么,不仅要写很多重复的代码,而且有一点问题需要重复的修改,所以,有时候,虽然实现了需求重要,但是怎么实现,同样重要!
相关文章
- 编写java判断闰年_用Java程序判断是否是闰年的简单实例[通俗易懂]
- java爬虫系列(一)——爬虫入门[通俗易懂]
- java出现中文乱码_Java开发中中文乱码总结
- MySQL字段类型如何转为java_Java JDBC中,MySQL字段类型到JAVA类型的转换
- 编写java判断闰年_Java 判断闰年代码实例
- xml格式化 java_Java XML格式化程序
- java webservice 实例_Java WebService 简单实例(附实例代码)
- java基本数据类型 think in java_Think in Java(一):Java基础[通俗易懂]
- java定时器实例_Java定时器小实例
- Java JSON格式字符串转JSON数组与JSON
- Java白皮书摘要
- Java接口是什么意思_JAVA接口
- Java list foreach_java的foreach
- java压缩与解压(Java.util.zip)详解编程语言
- Java中CountDownLatch用法详解编程语言
- Java经典实例:实现一个简单堆栈详解编程语言
- 如何使用Java连接MySQL数据库(java怎么连接mysql数据库)
- 客户端建立Redis集群:Java客户端指南(redis集群java)
- 分布式Java实现Redis分布式:从入门到精通(java实现redis)
- 机制Java Redis实现自动过期机制(redisjava过期)
- 测试Java操作Redis实例(java测试redis)
- Java Redis实例学习与应用(java redis实例)
- Linux 下安装Java:快速从零开始(linux 下载java)
- Java更新提升Oracle软件性能(java更新oracle)
- Java:DocumentBuilderFactory调用XML的方法实例
- JAVA算法起步之插入排序实例