博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dom4j解析XML文件-基本curd操作示例
阅读量:5828 次
发布时间:2019-06-18

本文共 5457 字,大约阅读时间需要 18 分钟。

解析XML文件主要用dom、sax、dom4j.

但:dom缺点:比较耗费内存

  sax缺点:只能对xml进行读取,不能修改添加,删除

所以,使用dom4j技术对XML文件进行(crud)操作:

package com.dom4j.test;

import java.io.File;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

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 Dom4jTest {

//演示使用dom4j对xml文件进行crud操作
public static void main(String[] args) throws DocumentException, IOException {
//1.得到解析器
SAXReader saxReader = new SAXReader();
//2.指定解析哪个XML文件
Document document = saxReader.read(new File("src/com/dom4j/test/myclasses3.xml"));
list(document.getRootElement()); //得到根元素
System.out.println();
System.out.println("**********读文件************");
read(document);
System.out.println();
System.out.println("**********添加************");
//添加元素
// add(document);
System.out.println();
System.out.println("**********删除************");
//删除元素
// delete(document);
System.out.println();
System.out.println("**********更新***********");
// update(document);
System.out.println();
System.out.println("**********指定位置添加***********");
addByIndex(document);
}
/**
* 添加一个元素到制定位置(林青霞之后,朱茵之前)
* @throws IOException
*/
public static void addByIndex(Document document) throws IOException {
//创建一个元素
Element newPerson = DocumentHelper.createElement("学生");
newPerson.setText("周星驰");
//得到所有学生的list
List<Element> allStudents = document.getRootElement().elements("学生");
for(int studentIndex = 0; studentIndex < allStudents.size(); studentIndex++){
if(allStudents.get(studentIndex).elementText("名字").equals("林青霞")) {
System.out.println(allStudents.get(studentIndex).elementText("名字"));
allStudents.add(studentIndex+1, newPerson);
break;
}
}
//更新
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(
new FileWriter("src/com/dom4j/test/myclasses3.xml"), output
);
writer.write(document);
writer.close();
}
/**
* 更新元素(所有学生的年龄加三岁)
* @throws IOException
*/
public static void update(Document document) throws IOException {
//得到所有学生的年龄
List<Element> students = document.getRootElement().elements("学生");
for (int student = 0; student < students.size(); student++) {
students.get(student).element("年龄").setText(Integer.toString(Integer.parseInt(students.get(student).element("年龄").getText())+3));
Element name = students.get(student).element("名字");
name.addAttribute("别名", "至尊宝");
name.addAttribute("性别", "女");
}
//更新
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(
new FileWriter("src/com/dom4j/test/myclasses3.xml"), output
);
writer.write(document);
writer.close();
}
/**
* 删除元素(要求:删除第一个学生)
* @throws IOException
*/
public static void delete(Document document) throws IOException {
//找到该元素
Element stu1 = document.getRootElement().elements("学生").get(0).element("名字");
//删除元素
// stu1.getParent().remove(stu1);
//删除元素的某个属性
stu1.remove(stu1.attribute("别名"));
//更新
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(
new FileWriter("src/com/dom4j/test/myclasses3.xml"), output
);
writer.write(document);
writer.close();
}
/**
* 添加元素(要求:添加一个学生到XML文件中)
* @param document
* @throws IOException
*/
public static void add(Document document) throws IOException{
//首先创建一个学生节点对象
Element newStudent = DocumentHelper.createElement("学生");
Element newStudentName = DocumentHelper.createElement("名字");
//给元素添加属性
newStudentName.addAttribute("别名", "紫霞仙子");
newStudentName.setText("朱茵");
Element newStudentAge = DocumentHelper.createElement("年龄");
Element newStudentIntro = DocumentHelper.createElement("介绍");
//把三个子元素(节点)加到newStudent下
newStudent.add(newStudentName);
newStudent.add(newStudentAge);
newStudent.add(newStudentIntro);
//把newStudent节点加到newStudent下
document.getRootElement().add(newStudent);
//老版本会出现中文乱码,可以限定格式或者按字节写
OutputFormat output = OutputFormat.createPrettyPrint();
// OutputFormat output = OutputFormat.createCompactFormat();
output.setEncoding("UTF-8");
//XML文件更新
XMLWriter writer = new XMLWriter(
new FileWriter("src/com/dom4j/test/myclasses3.xml"),output
);
writer.write(document);
writer.close();
}
/**
* 指定读取某个元素(读取第一个学生的信息)
* @param document
*/
public static void read(Document document) {
//得到一个根元素
Element root = document.getRootElement();
//root.elements(“学生”) : 取出 root元素下的所有学生元素
//root.element(“学生”) : 取出 root元素下的第一个学生元素
//root.elements(“学生”).get(0) : 取出 root元素下的第一个学生元素
Element stu = root.elements("学生").get(0);
Element stuName = stu.element("名字");
System.out.println("第一个学生:" + stu.element("名字").getText());
System.out.println("第二个学生:" + stu.elements("名字").get(0).getText());
System.out.println("第一个学生:" + stuName.getText());
System.out.println(stuName.getText() + "别名:" + stuName.attributeValue("别名"));
}
/**
* 遍历XML文件
* @param element
*/
public static void list(Element element) {
System.out.print(element.getName() + element.getTextTrim() + " ");
Iterator<Element> iterator = element.elementIterator();
while(iterator.hasNext()) {
Element e = (Element) iterator.next();
//递归
list(e);
}
}
}

测试所用的XML文件:

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

<!DOCTYPE xml>

<班级>

<学生>
<名字 别名="东方不败" 性别="女">林青霞</名字>
<年龄>47</年龄>
<介绍>演员</介绍>
</学生>
<学生>周星驰</学生>
<学生>
<名字 别名="紫霞仙子" 性别="女">朱茵</名字>
<年龄>47</年龄>
<介绍/>
</学生>
</班级>

转载于:https://www.cnblogs.com/enjong/articles/8484210.html

你可能感兴趣的文章
Cocos2dx 3.0开发环境的搭建--Eclipse建立在Android工程
查看>>
基本概念复习
查看>>
重构第10天:提取方法(Extract Method)
查看>>
Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
查看>>
解决pycharm在ubuntu下搜狗输入法一直固定在左下角的问题
查看>>
多线程day01
查看>>
react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
查看>>
MySQL出现Access denied for user ‘root’@’localhost’ (using password:YES)
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>
红黑树
查看>>
UIImagePickerController拍照与摄像
查看>>
python调用windows api
查看>>
第四章 mybatis批量insert
查看>>
Java并发框架——什么是AQS框架
查看>>
【数据库】
查看>>
Win配置Apache+mod_wsgi+django环境+域名
查看>>
linux清除文件内容
查看>>
WindowManager.LayoutParams 详解
查看>>
find的命令的使用和文件名的后缀
查看>>
Android的Aidl安装方法
查看>>