当前位置:  编程技术>java/j2ee

java操作XML实例代码

    来源: 互联网  发布时间:2014-11-01

    本文导语:  最近一直在做高效平台的框架,其实意识到我要做一个简单的框架的时候是在我已经做完我认为的一版界面之后,开始以为我要做的是一个可配置的首页展示,但是吭哧吭哧做了两个星期,大概功能实现了之后,才发现要做的...

最近一直在做高效平台的框架,其实意识到我要做一个简单的框架的时候是在我已经做完我认为的一版界面之后,开始以为我要做的是一个可配置的首页展示,但是吭哧吭哧做了两个星期,大概功能实现了之后,才发现要做的不是这个,哎,需求不清楚害死人啊,但是这两个星期并没有白白浪费,也从中学到了很多东西,下面主要介绍读取XML。
在做系统的时候,经常会遇到读取xml的需求,一开始是读取,于是我上网开始查询读取,接着查询删除,接着查询修改,当把这些代码查的差不多的时候,我发现,我为什么不把这些的操作都封装到一个类里,使用的时候直接调用,岂不是更好,感觉之前脑袋都秀逗了,分别查了那么多,还一个个的调试,抱着这个心态继续上网查(因为我真心感觉网上肯定有,如果我自己封装的话脑袋就真的进水了)。
源代码展示:

代码如下:

package com.gxpt.struts2;
import java.io.File;
import java.io.FileWriter;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class testAddDeleteXML {
private Document document;
 private String filePath; //文件所在的实际物理路径
 //private WriteLog writelog;
 public static void main(String[] args) throws DocumentException {
  //String filepath = System.getProperty("user.dir")+"/XmlFiles/LocalServicesConfig.xml";
  String filepath ="F:\JAVA项目\高校平台\demo\gxpt\WebContent\limits\manager.txt";
  testAddDeleteXML operator = new testAddDeleteXML(filepath);
  operator.getXmlFile();

  
//  Map map = new HashMap();
//  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");
  //String str = operator.getChild("div", "div8", "module");
  //System.out.println(str);
  //Element root = document.getRootElement();//获取根节点名称

  
 }

 

 public  testAddDeleteXML(String filepath){
  this.document = null;
  this.filePath = filepath;
  //writelog = new WriteLog();
 }
 /**
 * 创建XML文件
 * @param rootName:根节点名称
 */
 public void createXMLFile(String rootName) {
    if(!fileExist()){
     this.document = DocumentHelper.createDocument();
     this.document.addElement(rootName);
     saveXMLFile(this.document);
    }
 }
/**
* 获取已存在的XML文档
* @return
*/
 public Document getXmlFile() {
    if (fileExist()) {
     SAXReader reader = new SAXReader();
     try {
      this.document = reader.read(new File(filePath));
     } catch (DocumentException e) {
    //  String loginfo = StackTraceToString.getExceptionTrace(e);
    //  writelog.writeLogToEnd("LocalServerManager", loginfo);
     }finally{
      reader = null;
     }
    } else {
     //写日志
    // String loginfo = "XML file does not exist,read error!";
   //  writelog.writeLogToEnd("LocalServerManager",loginfo);
     System.exit(0);
    }
    return this.document;
 }

 /**
 * 添加元素
 * @param fatherPath:父节点名称
 * @param fatherattr:父节点属性
 * @param childName:要添加的节点名称
 * @param childValue:要添加的节点值
 */
 public void addChild(String fatherNode, String fatherAttr,String childName, String childValue,Map mapAttr) {
    ChildOperator(fatherNode,fatherAttr,childName,childValue,"add",mapAttr,0);
 }
 /**
 * 修改元素
 * @param fatherPath:父节点名称
 * @param fatherattr:父节点属性
 * @param childName:要修改的节点名称
 * @param childValue:要修改成的节点值
 */
 public void updateChild(String fatherNode, String fatherAttr,String childName, String childValue,int updatId) {
    ChildOperator(fatherNode,fatherAttr,childName,childValue,"update",null,updatId);
 }
 /**
 * 删除元素
 * @param fatherPath:父节点名称
 * @param fatherattr:父节点属性
 * @param childName:要删除的节点名称
 */
 public void deleteChild(String fatherNode, String fatherAttr,String childName) {
    ChildOperator(fatherNode,fatherAttr,childName,"","delete",null,0);
 }
 /**
 * 删除元素
 * @param fatherPath:父节点名称
 * @param fatherattr:父节点属性
 * @param childName:要删除的节点名称
 */
 public void deleteChildAll(String fatherNode, String fatherAttr,String childName) {
    ChildOperator(fatherNode,fatherAttr,childName,"","deleteAll",null,0);
 }

 
 /**
 * 删除某个元素
 * @param fatherPath:父节点名称
 * @param fatherattr:父节点属性
 * @param childName:要删除的节点名称
 */
 public void deleteChildOne(String fatherNode, String fatherAttr,String childName,String childValue) {
    ChildOperator(fatherNode,fatherAttr,childName,childValue,"deleteOne",null,0);
 }
 /**
 * 获取某个元素数值
 * @param fatherPath:父节点名称
 * @param fatherattr:父节点属性
 * @param childName:要删除的节点名称
 */
 public String getChild(String fatherNode, String fatherAttr,String childName) {
    String result = "";
    result = ChildOperator(fatherNode,fatherAttr,childName,"","get",null,0);
    return result;
 }
 /**
 * 子节点操作
 * @param fatherNode:父节点名称
 * @param fatherAttr:父节点属性
 * @param childName:要修改的节点
 * @param childValue:修改后的节点值
 * @param operator: 要执行的操作名称
 */
 private synchronized String ChildOperator(String fatherNode, String fatherAttr,String childName, String childValue,String operator,Map mapAttr,int updateId) {
    String result="";
    if (this.document == null) {

      return "null";
    }
    Element root = this.document.getRootElement();//获取根节点名称

    if(!root.getName().equals(fatherNode)){ //如果不是在根节点下添加
     result = XmlElementOperator(root,fatherNode,fatherAttr,childName,childValue,operator,mapAttr);
    }else{
      if(operator.equals("add")){
        Element childelement = root.addElement(childName);//根节点不存在元素属性值
        childelement.setAttributeValue("id",childValue);

       
        saveXMLFile(this.document);
      }else if(operator.equals("update")){
        List childelements = root.elements(childName);
       // for(Iterator childs=childelements.iterator();childs.hasNext();){
       //   Element everyone = (Element)childs.next();
        //  everyone.setText(childValue); //修改该元素值
       //   everyone.setAttributeValue("id",childValue);
         Element everyone = (Element)childelements.get(updateId);
         everyone.setAttributeValue("id",childValue);
      //  }
        saveXMLFile(this.document);
      }else if(operator.equals("delete")){
       List childelements = root.elements(childName);//获取当前节点下的所有子节点,判断其值,以进行修改
       for(Iterator childs=childelements.iterator();childs.hasNext();){
         Element everyone = (Element)childs.next();
         List childelements1 = everyone.elements("module");
         for(Iterator childs1=childelements1.iterator();childs1.hasNext();){
          Element everyone1 = (Element)childs1.next();
          everyone.remove(everyone1);
         }

         
       }

       saveXMLFile(this.document);
      }else if(operator.equals("get")){
       List childelements = root.elements(childName);//获取当前节点下的所有子节点,判断其值,以进行修改

       for(Iterator childs=childelements.iterator();childs.hasNext();){
        Element everyone = (Element)childs.next();

        result = everyone.getText();
       }
       saveXMLFile(this.document);
      }else if(operator.equals("deleteOne")){

       List childelements = root.elements(childName);//获取当前节点下的所有子节点,判断其值,以进行修改

       for(Iterator childs=childelements.iterator();childs.hasNext();){
         Element everyone = (Element)childs.next();
         String  divElement = everyone.attributeValue("id");
         if(divElement.equals(childValue)){
          root.remove(everyone);
         }
       }
       saveXMLFile(this.document);
      }else if(operator.equals("deleteAll")){
       List childelements = root.elements();//获取当前节点下的所有子节点,判断其值,以进行修改

       for(Iterator childs=childelements.iterator();childs.hasNext();){
        Element everyone = (Element)childs.next();
        List childeDiv = everyone.elements();
        for(Iterator childsDiv=childeDiv.iterator();childsDiv.hasNext();){
         Element everyoneDiv = (Element)childsDiv.next();
         everyone.remove(everyoneDiv);
        }
       }
      }
      saveXMLFile(this.document);

    }
    return result;
 } 
 /**
 * 递归元素操作
 * @param element:要递归的元素
 * @param fatherNode:父节点名称
 * @param fatherAttr:父节点属性
 * @param childName:要进行操作的节点
 * @param childValue:操作后的节点值
 * @param operator: 要执行的操作名称
 */
 private synchronized String XmlElementOperator(Element element,String fatherNode,String fatherAttr,String childName,String childValue,String operator,Map mapAttr){
    String result = "";
    List elements = element.elements();
    for(Iterator it=elements.iterator();it.hasNext();){
     Element currentelement = (Element)it.next();
     if(!currentelement.getName().equals(fatherNode)){ //当前元素并不是我们要查找的父元素时,继续查找
      XmlElementOperator(currentelement,fatherNode,fatherAttr,childName,childValue,operator,mapAttr);//递归调用
     }else{
      if(currentelement.attributeCount()>0){ //当前元素存在属性值时
       for(Iterator list=currentelement.attributeIterator();list.hasNext();){ //遍历属性值
        Attribute attr = (Attribute)list.next(); //获取属性值队列中的第一个元素
        if(attr.getValue().equals(fatherAttr)){//根据属性值确定惟一的父元素
         if(operator.equals("add")){//添加元素
          Element childelement = currentelement.addElement(childName); //给当前元素添加一个子元素

          childelement.setText(childValue); //设置子元素的数值
        Iterator itmapAttr = mapAttr.keySet().iterator();
          while(itmapAttr.hasNext()){
         String key = (String) itmapAttr.next();
         String value = mapAttr.get(key).toString();
          childelement.setAttributeValue(key,value);

        }

//          childelement.setAttributeValue("id", "m1");
//            childelement.setAttributeValue("name", "module1");
//            childelement.setAttributeValue("url", "index1.jsp");
         }else if(operator.equals("update")){//修改某个元素
          List childelements = currentelement.elements(childName);//获取当前节点下的所有子节点,判断其值,以进行修改
          for(Iterator childs=childelements.iterator();childs.hasNext();){
           Element everyone = (Element)childs.next();
           everyone.setText(childValue); //修改该元素值
          }
         }else if(operator.equals("delete")){ //删除某个指定的元素

          List childelements = currentelement.elements();//获取当前节点下的所有子节点,判断其值,以进行修改

          for(Iterator childs=childelements.iterator();childs.hasNext();){
           Element everyone = (Element)childs.next();
           currentelement.remove(everyone);
          }
         }else if(operator.equals("get")){
          List childelements = currentelement.elements(childName);//获取当前节点下的所有子节点,判断其值,以进行修改
          for(Iterator childs=childelements.iterator();childs.hasNext();){
            Element everyone = (Element)childs.next();
           // result = everyone.getText();
            result =everyone.attributeValue("id")+","+result ;
          }
         }
         else{
          //写日志
          //  String loginfo = "XmlFile Operator not exists!";
          //  writelog.writeLogToEnd("LocalServerManager",loginfo);
         }
        }
       }
      }
     }
    }
    saveXMLFile(this.document);
    return result;
 }
 /**
 * 保存XML文件
 * @param document: XML文件名
 */
 private void saveXMLFile(Document document) {
    try {
     OutputFormat format = OutputFormat.createPrettyPrint();
     format.setEncoding("utf-8");
     XMLWriter writer = new XMLWriter(new FileWriter(new File(filePath)),format);
     writer.write(document);  
     writer.close();
    } catch (Exception e) {  
    // String loginfo = StackTraceToString.getExceptionTrace(e);
    // writelog.writeLogToEnd("LocalServerManager", loginfo);
    }
 }
 /**
 * 判断XML文件是否存在.
 * @param fileName
 * @return
 */
 private boolean fileExist() {
    java.io.File objFile = new java.io.File(this.filePath);
    if (objFile.exists()) {
     return true;
    } else {
      return false;
  }
 }
}

XML文件:

代码如下:


 

     

    

   

 



 


 
 

 

  

 

 

解析:这里应用递归的方式来判断是对跟节点还是子节点的操作,相对比较清晰,这里用的是if判断来判断选择的是那种操作,如果变动相对较多,我感觉可以利用依赖注入,省去了if判断的麻烦,但是当时只是做了一个demo,没有更多的优化,如果有兴趣的话可以试一试。
总结:读取XML其实并不难,在写.NET系统的时候就写过关于xml的读取,但是当时真的就是一个一个的写,需要什么在哪个方法下写什么,不仅要写很多重复的代码,而且有一点问题需要重复的修改,所以,有时候,虽然实现了需求重要,但是怎么实现,同样重要!


    
 
 

您可能感兴趣的文章:

  • java Servlet获取和设置cookie实例代码
  • 万般火急!关于java打印,已经得到printerJob实例,那么怎么通过它得到Pageable实例?
  • 可以有其他两个类的实例同时调用一个java实例的两个方法吗?
  • <java技术手册>与<java实例技术手册>这两本书怎么样?
  • Java单例模式实例简述
  • 寻求java加密算法及实例
  • java web start实例代码COPY不了,怎么办?
  • 请问哪里有《java实例技术手册》的电子书下载?100分赠送!
  • 请教:JAVA中说什么类的实例,那是怎么样的一个概念呢?
  • java实现大数加法(BigDecimal)的实例代码
  • Java究竟能干些什么呢?清高手们列举一些实例出来,跟帖有分.
  • java HashMap的keyset实例
  • java获取当前日期使用实例
  • java之super关键字用法实例解析
  • Java调用DOS实现定时关机的实例
  • java结束进程的实例代码
  • java执行操作系统命令的问题:如何判断多个操作系统? iis7站长之家
  • java 如何获取对象实例的大小
  • 高分火速求解,请在线朋友回答:java自定义类怎样生成实例数组?( className[] N=new className[X];怎么不行?)
  • 刚学java想试编一个文本编辑器,各位能不能给推荐一些较好的参考程序或实例
  • Java位运算和逻辑运算的区别实例
  • java操作excel2007文档介绍及代码例子
  • java执行操作系统命令的问题:如何判断多个操作系统?
  • java初学者问:java操作平台是什么?用什么工具?
  • 我是java新手,请问java中与平台相关的操作是怎样实现的
  • Java的XML操作类库 JDOM
  • Java操作系统 JNode
  • Java 操作 Excel 的类库 jExcelApi
  • JAVA与数据库操作问题
  • 请问又没有java控制.exe或操作注册表的方法?
  • Java的Excel操作包 OpenXLS
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java实现判断字符串是否全是数字的四种方法代码举例
  • 寻找<<java2图形设计卷2SWING>>一书源代码和<<java网络高级编程>>一书源代码
  • andriod下java socket网络编程:java socket客户端服务端代码示例
  • 怎样将标准的C++代码转换成JAVA代码??
  • java Servlet实现Session创建存取以及url重写代码示例
  • 哪位会使用代码保护工具WingGuard来保护java代码?
  • Java代码分享工具 Java Gems
  • 各路JAVA高手们,能否给我一个用JAVA写的简单聊天室代码?
  • 你最喜欢去的JAVA网站或JAVA源代码下载网站是哪里???
  • JAVA APPLET与JSP有什么区别?好像都是把JAVA代码嵌到网页中。
  • java里有什么函数可以检查 java 代码并执行它?
  • 谁有Java源代码中floatToIntBits,intBitsToFloat的源代码?
  • 怎样看到java程序经过编译后的代码内容(bytecode的)或者在bytecode在JVM执行时JVM所解析的代码
  • 大哥大姐们小弟刚学JAVA,对它没点头绪啊!能告诉我JAVA在什么环境下编写代码和编译吗??
  • java与js代码互调示例代码
  • java文件复制代码片断(java实现文件拷贝)
  • 你认为最好的中文JAVA网站或有大量优秀JAVA源代码免费下载的网站是哪里???送分!!!
  • 有没有这样的软件:把一个不标准格式的JAVA原代码转换为具有标准(或比较标准)编码规范的代码。
  • 请问在java多线程中,是只有run(){}内的代码运行在一个新线程下呢?还是这个类中的代码都运行在一个新线程下?
  • 决定学Java,有没有小而好用的Java编辑器写代码,就象TurboC一样?
  • 刚学习Java,请教关于Java的Application代码编写问题。
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3