dom4j解析XML文件-基本curd操作示例
解析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</年龄>
<介绍/>
</学生>
</班级>