dom4j

来源:互联网 发布:临漳干部网络管理系统 编辑:程序博客网 时间:2024/06/05 21:03

两个常见的解析xml的思路:
DOM:将文档中所有内容都封装成对象.读取时,将对象都加载到内存中.在内存中创建一棵dom树(记录对象间的关系).
优点: 方便的进行增删改查.
缺点: 会非常消耗内存.
SAX:事件驱动的.把xml文档的 读取过程,划分出5类事件.我们只要提供遇到每类事件做相应的策略实现.
优点:内存占用小.
缺点: 不能进行增删改的操作.

DOM:    把所有内容封装成了5类对象.        document        Element        Attribute        Text        Commons        共同的父类        node        NOde的属性:            自身属性:                nodeType                nodeName                nodeValue            导航属性                找子节点的:firstChild lastChild childNodes                找父节点的:parentNode                找兄弟节点:nextSibling previousSibling    获得Element的方式        getElementById           ==> Document        getELementsByTagName     ==> Document/Element        getELementsByClassName   ==> Document/Element        getElementsByName        ==> Document    对于增删改的操作:        创建一个元素: document.createElement        添加一个元素: element.appendChild ,element.insertBefore        替换一个元素: element.replaceChild        删除一个元素: element.removeChild

dom4j中和了上述两种思想,操作xml简单方便,简单联系,源码中包含了相应的参考文档和需要的jar包,需要的可以在这里下载,
这里写图片描述

package com.qian.demo;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.Iterator;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class Dom4jUtil {    //直接将xml文件已string的形式输出 saxReader.read()--document--document.asXML()    public static void parseAsXml(String filename) throws DocumentException {        InputStream is = Dom4jUtil.class.getClassLoader().getResourceAsStream(filename);        SAXReader reader = new SAXReader();        Document document = reader.read(is);        String xmlContent = document.asXML();        System.out.println(xmlContent);    }    //遍历XML文件    public static void iterateXml(String filename) throws DocumentException{        InputStream is = Dom4jUtil.class.getClassLoader().getResourceAsStream(filename);        SAXReader reader = new SAXReader();        Document document = reader.read(is);        //1.获取根元素        Element root = document.getRootElement();        //2.迭代根元素以下的名字叫student的子元素        for(Iterator<Element> it=root.elementIterator("student");it.hasNext(); ){            Element studentEle = it.next();        //3.获取student元素的number熟悉            String number = studentEle.attributeValue("number");        //4.获取student子元素的内容            String name = studentEle.elementText("name");            String age = studentEle.elementText("age");            String sex = studentEle.elementText("sex");            System.out.println("学号"+number+",姓名:"+name+",年龄:"+age+",性别:"+sex+"");        }    }    //遍历XML文件    public static void listXml(String filename) throws DocumentException{        InputStream is = Dom4jUtil.class.getClassLoader().getResourceAsStream(filename);        SAXReader reader = new SAXReader();        Document document = reader.read(is);        //1.获取根元素        Element root = document.getRootElement();        //2.迭代根元素以下的名字叫student的子元素        List<Element> studentEleList = root.elements("student");        for(Element studentEle:studentEleList){            //3.获取student元素的number熟悉            String number = studentEle.attributeValue("number");            //4.获取student子元素的内容            String name = studentEle.elementText("name");            String age = studentEle.elementText("age");            String sex = studentEle.elementText("sex");            System.out.println("学号"+number+",姓名:"+name+",年龄:"+age+",性别:"+sex+"");        }    }    //增加元素    public static void addElement(String filename,Student stu ) throws DocumentException, IOException{        InputStream is = Dom4jUtil.class.getClassLoader().getResourceAsStream(filename);        SAXReader reader = new SAXReader();        Document document = reader.read(is);        //1.获取根节点        Element root = document.getRootElement();        //2.给根节点元素增加元素并且天津属性        Element studentEle = root.addElement("student").addAttribute("number", stu.getNumber());        //3 添加name age sex 子元素并添加子元素中的文本        studentEle.addElement("name").addText(stu.getName());        studentEle.addElement("age").addText(stu.getAge());        studentEle.addElement("sex").addText(stu.getSex());        //4将document对象会写到文件中,因为上面是把file.xml读到内存行程的dom树        //4.1创建一个格式输出器        OutputFormat format = OutputFormat.createPrettyPrint();        //4.2设置格式输出器的编码也就是说依那种方式写数据        format.setEncoding("utf-8");        String realPath = "src/main/resources/"+filename;        System.out.println(realPath);        XMLWriter writer = new XMLWriter(new FileOutputStream(realPath),format);        writer.write(document);        writer.flush();        writer.close();    }    //删除一个元素,元素的number为0009    public static boolean deleteStudent(String filename,String number) throws Exception{        InputStream is = Dom4jUtil.class.getClassLoader().getResourceAsStream(filename);        SAXReader reader = new SAXReader();        Document document = reader.read(is);        // 1 获得根元素        Element root = document.getRootElement();        // 使用xpath找到我们需要元素        // 定义xpath        String xpath = "//student[@number='"+number+"']";        Element studentEle = (Element) document.selectSingleNode(xpath);        // 删除        boolean b =  studentEle.getParent().remove(studentEle);        // 回写        String realPath = "src/main/resources/"+filename;        System.out.println(realPath);        XMLWriter writer = new XMLWriter(new FileOutputStream(realPath),                OutputFormat.createPrettyPrint());        writer.write(document);        writer.close();        return b;    }    //修改一个元素,元素的number为0009学生的age变为90;    public static boolean updateStudent(String filename,Student stu) throws Exception{        InputStream is = Dom4jUtil.class.getClassLoader().getResourceAsStream(filename);        SAXReader reader = new SAXReader();        Document document = reader.read(is);        // 1 获得根元素        Element root = document.getRootElement();        // 使用xpath找到我们需要元素        // 定义xpath        String xpath = "//student[@number='"+stu.getNumber()+"']";        Element studentEle = (Element) document.selectSingleNode(xpath);        //修改        studentEle.element("name").setText(stu.getName());        studentEle.element("age").setText(stu.getAge());        studentEle.element("sex").setText(stu.getSex());        // 回写        String realPath = "src/main/resources/"+filename;        XMLWriter writer = new XMLWriter(new FileOutputStream(realPath),                OutputFormat.createPrettyPrint());        writer.write(document);        writer.close();        return true;    }    /*public static void main(String[] args) {            try {                parseAsXml("students.xml");                //iterateXml("students.xml");                System.out.println("==========================");                Student stu = new Student();                stu.setNumber("0009");                stu.setName("张三");                stu.setAge("20");                stu.setSex("male");                addElement("students.xml", stu);                System.out.println("==========================");                Thread.sleep(100);                listXml("students.xml");                //deleteStudent("students.xml", "0009");                Student stu2 = new Student();                stu.setNumber("0009");                stu.setName("李四");                stu.setAge("20");                stu.setSex("female");                updateStudent("students.xml", stu2);            } catch (Exception e) {                e.printStackTrace();            }    }*/}
原创粉丝点击