解析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</年龄> <介绍/> </学生> </班级>