zl程序教程

您现在的位置是:首页 >  后端

当前栏目

java操作XML实例代码

2023-06-13 09:15:16 时间

最近一直在做高效平台的框架,其实意识到我要做一个简单的框架的时候是在我已经做完我认为的一版界面之后,开始以为我要做的是一个可配置的首页展示,但是吭哧吭哧做了两个星期,大概功能实现了之后,才发现要做的不是这个,哎,需求不清楚害死人啊,但是这两个星期并没有白白浪费,也从中学到了很多东西,下面主要介绍读取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的读取,但是当时真的就是一个一个的写,需要什么在哪个方法下写什么,不仅要写很多重复的代码,而且有一点问题需要重复的修改,所以,有时候,虽然实现了需求重要,但是怎么实现,同样重要!