java操作XML实例代码

最近一直在做高效平台的框架,其实意识到我要做一个简单的框架的时候是在我已经做完我认为的一版界面之后,开始以为我要做的是一个可配置的首页展示,但是吭哧吭哧做了两个星期,大概功能实现了之后,才发现要做的不是这个,哎,需求不清楚害死人啊,但是这两个星期并没有白白浪费,也从中学到了很多东西,下面主要介绍读取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文件:


代码如下:

<?xml version="1.0" encoding="utf-8"?>

<style>

<div id="div8">

<module id="m1" name="module1" url="index1.jsp"/>

<module id="m2" name="module2" url="index2.jsp"/>

<module id="m3" name="module3" url="index3.jsp"/>

</div>

<div id="div9">

<module id="m9" name="module9" url="index3.jsp"/>

<module id="m10" name="module10" url="index4.jsp"/>

<module id="m11" name="module11" url="index5.jsp"/>

</div>

</style>

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

(0)

相关推荐

  • Java连接并操作Sedna XML数据库的方法

    本文实例讲述了Java连接并操作Sedna XML数据库的方法.分享给大家供大家参考.具体分析如下: Sedna 是一个原生的XML数据库,提供了全功能的核心数据库服务,包括持久化存储.ACID事务.索引.安全.热备.UTF8等.实现了 W3C XQuery 规范,支持全文搜索以及节点级别的更新操作. import ru.ispras.sedna.driver.*; public class SednaClient { public static void main(String args[])

  • JAVA操作XML实例分析

    本文实例讲述了JAVA操作XML的方法.分享给大家供大家参考.具体如下: java代码如下: 复制代码 代码如下: import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.w3c.dom.*; import org.xml.sax.SAXException; import javax.xml.

  • java对XML文件的解析、节点的增加、删除操作总结

    1.java代码: 主要采用dom来进行操作 复制代码 代码如下: package test; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.T

  • java操作(DOM、SAX、JDOM、DOM4J)xml方式的四种比较与详解

    1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不是像SAX那

  • java实现XML增加元素操作简单示例

    本文实例讲述了java实现XML增加元素操作.分享给大家供大家参考,具体如下: package Day01; import java.io.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.*; public

  • java使用Jdom实现xml文件写入操作实例

    本文实例讲述了java使用Jdom实现xml文件写入操作的方法.分享给大家供大家参考,具体如下: package com.yanek.demo.xml.test; import java.io.File; import java.io.FileWriter; import org.jdom.Attribute; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; import o

  • java中四种操作xml方式的比较

    1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不是像SAX那

  • java使用dom4j操作xml示例代码

    dom4j是一个非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源工具.可以在这个地址http://dom4j.sourceforge.net进行下载.这里我们使用到的dom4j是dom4j-1.6.1这个版本,我们只需要使用到如下两个jar包: 复制代码 代码如下: dom4j-1.6.1.jarcommons-io-2.4.jar 1.dom4j读取xml字符串 复制代码 代码如下: import org.dom4j.Document;imp

  • java使用jaxb操作xml示例

    首先定义两个示例类ClassA,ClassB,用于后续的示例演示 复制代码 代码如下: package cn.lzrabbit; public class ClassA {     private int classAId;     private String classAName; private ClassB classB; public int getClassAId() {         return classAId;     } public void setClassAId(i

  • java操作XML实例代码

    最近一直在做高效平台的框架,其实意识到我要做一个简单的框架的时候是在我已经做完我认为的一版界面之后,开始以为我要做的是一个可配置的首页展示,但是吭哧吭哧做了两个星期,大概功能实现了之后,才发现要做的不是这个,哎,需求不清楚害死人啊,但是这两个星期并没有白白浪费,也从中学到了很多东西,下面主要介绍读取XML.在做系统的时候,经常会遇到读取xml的需求,一开始是读取,于是我上网开始查询读取,接着查询删除,接着查询修改,当把这些代码查的差不多的时候,我发现,我为什么不把这些的操作都封装到一个类里,使用

  • JavaScript操作XML实例代码(获取新闻标题并分页,并分页)

    具体内容我没有做测试.仅供参考 代码 复制代码 代码如下: <?xml version="1.0" encoding="gb2312"?> <NEWS> <New id="1" name="测试新闻1" time="2010-2-18"> <NBody>新闻测试1新闻测试1</NBody> </New> <New id="

  • Java操作XML工具类XmlUtil详解

    本文实例为大家分享了Java操作XML工具类的具体代码,供大家参考,具体内容如下 一.代码 public class XmlUtil { /** * 将XML文件输出到指定的路径 * * @param doc * @param fileName * @throws Exception */ public static void outputXml(Document doc, String fileName) throws Exception { TransformerFactory tf = T

  • Java回调函数实例代码详解

    首先说说什么叫回调函数? 在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就 称为回调.在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃. 这样的解释似乎还是比较难懂,这里举个简 单的例子: 程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法.目的达到

  • C# 通过 oledb 操作Excel实例代码

    整理文档,搜刮出一个C# 通过 oledb 操作Excel实例代码,稍微整理精简一下做下分享. public string GetConnectionString() { Dictionary<string, string> props = new Dictionary<string, string>(); // XLSX - Excel 2007, 2010, 2012, 2013 props["Provider"] = "Microsoft.ACE

  • java操作xml的方法汇总及解析

    这篇文章主要介绍了java操作xml的方法汇总及解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一丶常用方法 主要有3个方面, 1读取xml文件, 2使用xpath根据指定路径获取某一节点数据 3, xml和java bean的转换 XmlUtils.java /** * 和cn.hutool.core.util.XmlUtil许多功能重合, 本类可以当做学习的例子 * 可以直接使用cn.hutool.core.util.XmlUtil *

  • Java编程Nashorn实例代码

    本文研究的主要是Java编程Nashorn的相关内容,具体如下. Nashorn是什么 Nashorn,发音"nass-horn",是德国二战时一个坦克的命名,同时也是java8新一代的javascript引擎--替代老旧,缓慢的Rhino,符合 ECMAScript-262 5.1 版语言规范.你可能想javascript是运行在web浏览器,提供对html各种dom操作,但是Nashorn不支持浏览器DOM的对象.这个需要注意的一个点. 之前学习Java8的时候恰好写了个简单的例子

  • Django+mysql配置与简单操作数据库实例代码

     第一步:下载mysql驱动 cmd进入创建好的django项目目录:使用命令 pip install mysqlclient 等待安装成功! 第二步:在settings.py中配置mysql连接参数(没有mysql的先装mysql) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '数据库名(你得先在mysql中创建数据库)', 'USER':'mysql用户名(如root)', 'PASSWOR

  • java图片添加水印实例代码分享

    本文为大家介绍了java图片添加水印实例代码,java实现水印还是非常方便的,水印可以是图片或者文字,具体内容如下 package michael.io.image; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io

随机推荐