dom4j

两个常见的解析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();
            }

    }*/
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值