本文介绍如何通过JDOM来操作XML文件。主要包括对XML文件的增删改查等操作,具体详见代码部分注释,该方法可以满足大部分对XML文件的操作。首先展示一张XML文件的最终效果图:
代码如下:
package com.zys.util; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.input.SAXBuilder; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; /** * @description 写入数据到xml文件与从xml中读取数据 * @author 592813685@qq.com * @date 2018年1月1日下午2:11:48 * @filename DomUtil.java */ public class JDomUtil { public static boolean insertDataToXml(String data) { return false; } /** * 创建一个xml格式的文件 * @param path * @return false:创建失败 true:创建成功 */ public static boolean initXmlFile(String path) { //创建文档 Document document = new Document(); //创建根元素 Element root = new Element("user"); //把根元素加入到document中 document.addContent(root); //创建父元素 Element directory = new Element("directory"); //把元素加入到根元素中 root.addContent(directory); //设置目录元素属性 directory.setAttribute("name", "我的文件夹"); SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm");//设置日期格式 String date=df.format(new Date()); directory.setAttribute("time",date); //在目录下添加文件 // Element file = new Element("file"); // file.setText("file1"); // file.setAttribute("md5","1234567"); // directory.addContent(file); //设置xml输出格式 Format format = Format.getPrettyFormat(); format.setEncoding("utf-8");//设置编码 format.setIndent(" ");//设置缩进 //得到xml输出流 XMLOutputter out = null; //把数据输出到xml中 try { out = new XMLOutputter(format); out.output(document, new FileOutputStream(path)); } catch (IOException e) { e.printStackTrace(); return false; }finally { out=null; } return true; } /** * 在已有的xml文件中,指定的目录节点下追加新的节点 * @param filePath xml文件路径 * @param dirName 指定目录名 * @param fileName 文件名 * @param md5 文件md5值 * @return true:插入成功, false:插入失败 */ public static boolean appendFileNodeAfterDir(String filePath,String nameValue,String fileName, String md5) { // 1.创建一个SAXBuilder对象 SAXBuilder saxBuilder = new SAXBuilder(); InputStream in=null; //需要插入的目录标签的下标 int insertIndex=-1; try { // 2.创建一个输入流,将xml文件加载到输入流 in = new FileInputStream(filePath); // 3.通过SAXBuilder的build方法将输入流加载到SAXBuilder中 Document document = saxBuilder.build(in); // 4.通过Document对象获取xml文件的根节点 Element rootElement = document.getRootElement(); // 5.根据根节点获取子节点的List集合 List<Element> directoryList = rootElement.getChildren(); for(int i=0;i<directoryList.size();i++) { Element directory = (Element) rootElement.getChildren("directory").get(i); if(directory.getAttributeValue("name").toString().equals(nameValue)) { insertIndex=i; } } if(insertIndex==-1) { return false; } // 6.追加节点 Element file = new Element("file"); file.setText(fileName); file.setAttribute("md5",md5); directoryList.get(insertIndex).addContent(file); // 7.设置输出流和输出格式 Format format = Format.getCompactFormat(); format.setEncoding("utf-8"); format.setIndent(" "); XMLOutputter outputter = new XMLOutputter(format); outputter.output(document, new FileOutputStream(filePath)); } catch (Exception e) { e.printStackTrace(); return false; }finally { try { if(in!=null) { in.close(); } }catch(Exception e) { e.printStackTrace(); } } return true; } /** * 在根标签下插入一个目录标签 * @param filePath xml文件路径 * @param nameValue 父标签name属性值 * @return false:插入失败, true:插入成功 */ public static boolean insertToDirectory(String filePath,String nameValue) { // 1.创建一个SAXBuilder对象 SAXBuilder saxBuilder = new SAXBuilder(); InputStream in=null; try { // 2.创建一个输入流,将xml文件加载到输入流 in = new FileInputStream(filePath); // 3.通过SAXBuilder的build方法将输入流加载到SAXBuilder中 Document document = saxBuilder.build(in); // 4.通过Document对象获取xml文件的根节点 Element rootElement = document.getRootElement(); // 5.根据根节点获取子节点的List集合 List<Element> directoryList = rootElement.getChildren(); //属性值相同的标签不允许重复创建 for(int i=0;i<directoryList.size();i++) { Element directory = (Element) rootElement.getChildren("directory").get(i); if(directory.getAttributeValue("name").toString().equals(nameValue)) { System.err.println("属性值为:"+nameValue+"的目录已经创建过!"); return false; } } //创建父元素 Element directory = new Element("directory"); //把元素加入到根元素中 rootElement.addContent(directory); //设置目录元素属性 directory.setAttribute("name",nameValue); // 7.设置输出流和输出格式 Format format = Format.getCompactFormat(); format.setEncoding("utf-8"); format.setIndent(" "); XMLOutputter outputter = new XMLOutputter(format); outputter.output(document, new FileOutputStream(filePath)); } catch (Exception e) { e.printStackTrace(); return false; }finally { try { if(in!=null) { in.close(); } }catch(Exception e) { e.printStackTrace(); return false; } } return true; } /** * 删除指定属性值的directory标签 * @param filePath 文件路径 * @param nameValue 属性值 * @return false:删除失败, true:删除成功 */ public static boolean deleteDirectoryByName(String filePath,String nameValue) { // 1.创建一个SAXBuilder对象 SAXBuilder saxBuilder = new SAXBuilder(); InputStream in=null; try { // 2.创建一个输入流,将xml文件加载到输入流 in = new FileInputStream(filePath); // 3.通过SAXBuilder的build方法将输入流加载到SAXBuilder中 Document document = saxBuilder.build(in); // 4.通过Document对象获取xml文件的根节点 Element rootElement = document.getRootElement(); // 5.根据根节点获取子节点的List集合 List<Element> directoryList = rootElement.getChildren(); //属性值相同的标签不允许重复创建 for(int i=0;i<directoryList.size();i++) { Element directory = (Element) rootElement.getChildren("directory").get(i); if(directory.getAttributeValue("name").toString().equals(nameValue)) { rootElement.removeContent(directoryList.get(i)); System.err.println("属性值为:"+nameValue+"的目录已经被删除!"); } } // 7.设置输出流和输出格式 Format format = Format.getCompactFormat(); format.setEncoding("utf-8"); format.setIndent(" "); XMLOutputter outputter = new XMLOutputter(format); outputter.output(document, new FileOutputStream(filePath)); } catch (Exception e) { e.printStackTrace(); return false; }finally { try { if(in!=null) { in.close(); } }catch(Exception e) { e.printStackTrace(); return false; } } return true; } /** * 根据指定的md5值删除文件节点 * @param filePath 文件路径 * @param nameValue 目录属性值 * @param fileName 文件名 * @return false:删除失败 true:删除成功 */ public static boolean deleteFileByName(String filePath,String nameValue,String fileName/**md5**/) { // 1.创建一个SAXBuilder对象 SAXBuilder saxBuilder = new SAXBuilder(); InputStream in=null; //需要插入的目录标签的下标 int deleteIndex=-1; try { // 2.创建一个输入流,将xml文件加载到输入流 in = new FileInputStream(filePath); // 3.通过SAXBuilder的build方法将输入流加载到SAXBuilder中 Document document = saxBuilder.build(in); // 4.通过Document对象获取xml文件的根节点 Element rootElement = document.getRootElement(); // 5.根据根节点获取子节点的List集合 List<Element> directoryList = rootElement.getChildren(); for(int i=0;i<directoryList.size();i++) { Element directory = (Element) rootElement.getChildren("directory").get(i); if(directory.getAttributeValue("name").toString().equals(nameValue)) { deleteIndex=i; } } if(deleteIndex==-1) { return false; } // 6.删除子节点 List<Element> fileList=directoryList.get(deleteIndex).getChildren(); for(int i=0;i<fileList.size();i++) { Element child=fileList.get(i); // if(child.getAttributeValue("md5").toString().equals(md5)) { // directoryList.get(deleteIndex).removeContent(child); // System.err.println("md5值为"+md5+"的子节点被删除!"); // } if(child.getText().equals(fileName)) { directoryList.get(deleteIndex).removeContent(child); System.err.println("文件名为"+fileName+"的子节点被删除!"); } } // 7.设置输出流和输出格式 Format format = Format.getCompactFormat(); format.setEncoding("utf-8"); format.setIndent(" "); XMLOutputter outputter = new XMLOutputter(format); outputter.output(document, new FileOutputStream(filePath)); } catch (Exception e) { e.printStackTrace(); return false; }finally { try { if(in!=null) { in.close(); } }catch(Exception e) { e.printStackTrace(); return false; } } return true; } /** * 获得所有的目录名 * @param filePath 文件路径 * @return dirNameValueList:目录列表 null:查找失败 */ public static List<String> getAllDirectoryName(String filePath) { // 1.创建一个SAXBuilder对象 SAXBuilder saxBuilder = new SAXBuilder(); InputStream in=null; List<String> dirNameValueList=new ArrayList<String>(); try { // 2.创建一个输入流,将xml文件加载到输入流 in = new FileInputStream(filePath); // 3.通过SAXBuilder的build方法将输入流加载到SAXBuilder中 Document document = saxBuilder.build(in); // 4.通过Document对象获取xml文件的根节点 Element rootElement = document.getRootElement(); // 5.根据根节点获取子节点的List集合 List<Element> directoryList = rootElement.getChildren(); for(int i=0;i<directoryList.size();i++) { Element directory = (Element) rootElement.getChildren("directory").get(i); dirNameValueList.add(directory.getAttributeValue("name").toString()); } // 7.设置输出流和输出格式 Format format = Format.getCompactFormat(); format.setEncoding("utf-8"); format.setIndent(" "); XMLOutputter outputter = new XMLOutputter(format); outputter.output(document, new FileOutputStream(filePath)); } catch (Exception e) { e.printStackTrace(); System.err.println("获得所有的目录标签失败"); return null; }finally { try { if(in!=null) { in.close(); } }catch(Exception e) { e.printStackTrace(); return null; } } return dirNameValueList; } /** * 根据目录名获得目录下所有文件名 * @param filePath xml文件路径 * @param dirName 目录名 * @return fileNameList:文件列表 null:查找失败 */ public static List<String> getAllFileName(String filePath,String dirName){ // 1.创建一个SAXBuilder对象 SAXBuilder saxBuilder = new SAXBuilder(); InputStream in=null; List<String> fileNameList=new ArrayList<String>(); int dirIndex=-1; try { // 2.创建一个输入流,将xml文件加载到输入流 in = new FileInputStream(filePath); // 3.通过SAXBuilder的build方法将输入流加载到SAXBuilder中 Document document = saxBuilder.build(in); // 4.通过Document对象获取xml文件的根节点 Element rootElement = document.getRootElement(); // 5.根据根节点获取子节点的List集合 List<Element> directoryList = rootElement.getChildren(); for(int i=0;i<directoryList.size();i++) { Element directory = (Element) rootElement.getChildren("directory").get(i); if(directory.getAttributeValue("name").toString().equals(dirName)) { dirIndex=i; } } if(dirIndex==-1) { return null; } // 6.遍历文件节点,并将其保存到列表中 List<Element> fileList=directoryList.get(dirIndex).getChildren(); for(int i=0;i<fileList.size();i++) { Element child=fileList.get(i); fileNameList.add(child.getText()); } // 7.设置输出流和输出格式 Format format = Format.getCompactFormat(); format.setEncoding("utf-8"); format.setIndent(" "); XMLOutputter outputter = new XMLOutputter(format); outputter.output(document, new FileOutputStream(filePath)); } catch (Exception e) { e.printStackTrace(); return null; }finally { try { if(in!=null) { in.close(); } }catch(Exception e) { e.printStackTrace(); return null; } } return fileNameList; } /** * 修改指定目录的属性值 * @param filePath xml文件路径 * @param nameValue 修改前属性值 * @param newName 修改后的属性值 * @return true:修改成功 false:修改失败 */ public static boolean editDirectoryName(String filePath,String nameValue,String newName) { // 1.创建一个SAXBuilder对象 SAXBuilder saxBuilder = new SAXBuilder(); InputStream in=null; try { // 2.创建一个输入流,将xml文件加载到输入流 in = new FileInputStream(filePath); // 3.通过SAXBuilder的build方法将输入流加载到SAXBuilder中 Document document = saxBuilder.build(in); // 4.通过Document对象获取xml文件的根节点 Element rootElement = document.getRootElement(); // 5.根据根节点获取子节点的List集合 List<Element> directoryList = rootElement.getChildren(); for(int i=0;i<directoryList.size();i++) { Element directory = (Element) rootElement.getChildren("directory").get(i); if(directory.getAttributeValue("name").toString().equals(nameValue)) { directoryList.get(i).setAttribute("name", newName); } } // 7.设置输出流和输出格式 Format format = Format.getCompactFormat(); format.setEncoding("utf-8"); format.setIndent(" "); XMLOutputter outputter = new XMLOutputter(format); outputter.output(document, new FileOutputStream(filePath)); } catch (Exception e) { e.printStackTrace(); System.err.println("修改目录名字失败"); return false; }finally { try { if(in!=null) { in.close(); } }catch(Exception e) { e.printStackTrace(); return false; } } return true; } /** * 修改指定目录下文件的名字 * @param filePath XML文件路径 * @param dirName 目录名 * @param fileName 修改前的文件名 * @param newName 修改后的文件名 * @return false:修改失败 true:修改成功 */ public static boolean editFileName(String filePath,String dirName,String fileName,String newName) { // 1.创建一个SAXBuilder对象 SAXBuilder saxBuilder = new SAXBuilder(); InputStream in=null; int dirIndex=-1; try { // 2.创建一个输入流,将xml文件加载到输入流 in = new FileInputStream(filePath); // 3.通过SAXBuilder的build方法将输入流加载到SAXBuilder中 Document document = saxBuilder.build(in); // 4.通过Document对象获取xml文件的根节点 Element rootElement = document.getRootElement(); // 5.根据根节点获取子节点的List集合 List<Element> directoryList = rootElement.getChildren(); for(int i=0;i<directoryList.size();i++) { Element directory = (Element) rootElement.getChildren("directory").get(i); if(directory.getAttributeValue("name").toString().equals(dirName)) { dirIndex=i; } } if(dirIndex==-1) { return false; } // 6.遍历文件节点,并将其保存到列表中 List<Element> fileList=directoryList.get(dirIndex).getChildren(); for(int i=0;i<fileList.size();i++) { Element child=fileList.get(i); if(child.getText().equals(fileName)) { child.setText(newName); } } // 7.设置输出流和输出格式 Format format = Format.getCompactFormat(); format.setEncoding("utf-8"); format.setIndent(" "); XMLOutputter outputter = new XMLOutputter(format); outputter.output(document, new FileOutputStream(filePath)); } catch (Exception e) { e.printStackTrace(); System.err.println("文件名修改失败"); return false; }finally { try { if(in!=null) { in.close(); } }catch(Exception e) { e.printStackTrace(); } } return true; } }
利用JDOM操作XML文件
最新推荐文章于 2025-05-28 13:57:57 发布