JavaWeb笔记-06-dom4j解析操作xml 实现对节点的增删改查

1、使用dom4j 解析xml

准备工作:
    1)导入dom4j提供的jar包   // 因为 dom4j 不是javase的一部分,所以需要先导包
        a.创建文件夹lib
        b.复制jar包到lib中
        c.右键dom4j -> 构建路径 -> 添加到构建路径
        d.成功后dom4j前图标变为小奶瓶

知识点:
    得到document文档
        SAXReader saxReader = new SAXReader();
        Document document = SAXReader.read(url);

    方法:
        document.getRootElemnet(); 获取根节点
        Node.getParent(); 获取父节点。
        element.addElement() ;添加标签 

        element(qname); 获取标签下的第一个子标签
        elements(qname);获取标签下的一层子标签
        elements(); 获取调用者的所有子标签

作为dom tree ,从上到下 一行一行解析

2、使用dom4j查询xml

(1)查询所有name元素里面的值

步骤:
    1)创建解析器  //SAXReader saxReader = new SAXReader();

    2)得到document  //Document document = saxReader.read("src/dom4j/p1.xml");

    3)得到根节点  // Element root = document.getRootElement();

    4)得到所有的p1标签     
            //List<Element> list = root.elements();
            //遍历集合  for (Element element : list) 

    5)得到name  //Element name1 = element.element("name");

    6)得到name的值  //name1.getText();
private static void selectName() throws Exception {
        // TODO Auto-generated method stub
        // 1)创建解析器
        SAXReader saxReader = new SAXReader();

        // 2)得到document
        Document document = saxReader.read("src/dom4j/p1.xml");

        // 3)得到根节点
        Element root = document.getRootElement();

        // 4)得到所有的p1标签
        List<Element> list = root.elements();
        // element(qname); 获取标签下的第一个子标签
        // elements(qname);获取标签下的一层子标签
        // elements(); 获取调用者的所有子标签

        for (Element element : list) {
            // 5)得到name
            Element name1 = element.element("name");
            // 6)得到name的值
            String s = name1.getText();
            System.out.println(s);
        }   
    }
}

(2)获取第一个name的值

    在(1)的基础上

     修改 4)为 得到第一个p1 //Element p1 = root.element("p1");

(3)得到第二个name的值

    在(1)的基础上 

    在 4) 中添加语句  Element p1 = list.get(1);   //根据集合下标获取第二个p1

3、使用dom4j实现添加操作

在第一个 p1 后添加 man 标签。

步骤: 
    1)创建解析器    // SAXReader saxReader = new SAXReader();

    2)得到document   // Document document = saxReader.read("src/dom4j/p1.xml");

    3)得到根节点    // Element root = document.getRootElement();

    4)得到第一个p1   // Element p1 = root.element("p1");

    5)在p1下直接添加   // Element sex1 = p1.addElement("sex");

    6)在sex1下添加文本   //sex1.addText("man");

    7)回写
        a.OutputFormat format = OutputFormat.createPrettyPrint(); 
            //写入格式为 PrettyPrint  通俗理解为带缩进   

        b.XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/dom4j/p1.xml"), format);
            //XMLWriter表示一个写入器,可以生成包含 XML 数据的流或文件
            传参为 1.文件路径new FileOutputStream("文件路径")   
                   2. 写入格式

        c.xmlWriter.write(document);   //修改到文件
        d.xmlWriter.close();     //流关闭
    private static void addSex() throws Exception {
        // TODO Auto-generated method stub
        // 1)创建解析器
        SAXReader saxReader = new SAXReader();

        // 2)得到document
        Document document = saxReader.read("src/dom4j/p1.xml");

        // 3)得到根节点
        Element root = document.getRootElement();

        // 得到第一个p1
        Element p1 = root.element("p1");

        // 在p1下直接添加
        Element sex1 = p1.addElement("sex");

        // 在sex1下添加文本
        sex1.addText("man");

        // 回写
        OutputFormat format = OutputFormat.createPrettyPrint(); // 有缩进的效果
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(
                "src/dom4j/p1.xml"), format);
        xmlWriter.write(document);
        xmlWriter.close();

    }

4、使用dom4j在特定位置添加元素 .add(int index , E element)

在第一个p1下面的age标签之前添加

步骤:
    1)创建解析器   //SAXReader saxReader = new SAXReader();

    2)得到document   //Document document = saxReader.read("src/dom4j/p1.xml");

    3)得到根节点    //Element root = document.getRootElement();

    4)得到第一个p1   //Element p1 = root.element("p1");

    5)获取p1下所有的元素   //List<Element> list = p1.elements();

     6)创建标签   在标签下创建文本 
            //Element school = DocumentHelper.createElement("school");
            //school.setText("xupt");

    7)使用list方法,在特定位置添加元素  
            //list.add(1,school);

    // 8)回写
        OutputFormat format = OutputFormat.createPrettyPrint(); 
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(
                "src/dom4j/p1.xml"), format);
        xmlWriter.write(document);
        xmlWriter.close();

private static void addEleToAgeBefore() throws Exception {
        // TODO Auto-generated method stub
        // 1)创建解析器
        // SAXReader saxReader = new SAXReader();

        // 2)得到document
        // Document document = saxReader.read("src/dom4j/p1.xml");
        Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);
        // 3)得到根节点
        Element root = document.getRootElement();

        // 4)得到第一个p1
        Element p1 = root.element("p1");

        // 5)获取p1下所有的元素
        List<Element> list = p1.elements();

        // 6)创建标签 在标签下创建文本
        Element school = DocumentHelper.createElement("school");
        school.setText("xupt");

        // 7)使用list方法,在特定位置添加元素 add(int index , E element)
        list.add(1, school);

        /*
         * // 8)回写 OutputFormat format = OutputFormat.createPrettyPrint(); //
         * 有缩进的效果 XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(
         * "src/dom4j/p1.xml"), format); xmlWriter.write(document);
         * xmlWriter.close();
         */
        // 使用封装文件方法
        Dom4jUtils.xmlWriters(Dom4jUtils.Path, document);
    }

5、使用dom4j实现修改节点的操作(使用封装类 public class Dom4jUtils )

修改第一个p1下age元素的值 .setText();

步骤:
    1)得到document    //Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);

    2)得到根节点    // Element root = document.getRootElement();

    3)得到第一个p1   // Element p1 = root.element("p1");

    4)得到p1下的age  // Element age1 = p1.element("age");

    5)修改age的值  //age1.setText("300");

    6)回写到xml    //Dom4jUtils.xmlWriters(Dom4jUtils.Path, document);
private static void setAge() throws Exception {
        // 1)得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);

        // 2)得到根节点
        Element root = document.getRootElement();

        // 3)得到第一个p1
        Element p1 = root.element("p1");

        // 4)得到p1下的age
        Element age1 = p1.element("age");

        // 5)修改age的值
        age1.setText("300");

        // 6)回写
        Dom4jUtils.xmlWriters(Dom4jUtils.Path, document);
    }

5、使用dom4j实现删除节点的操作(使用封装类 public class Dom4jUtils )

删除p1下的school 方法: .remove(school);

步骤:
    1)得到document   // Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);

    2)得到根节点   // Element root = document.getRootElement();

    3)得到第一个p1   // Element p1 = root.element("p1");

    4)得到p1下的school   // Element school = p1.element("school");

    5)获取school标签的父节点,然后删除school
            // Element schParent = school.getParent();
            // schParent.remove(school);

    // 6)回写
    Dom4jUtils.xmlWriters(Dom4jUtils.Path, document);
private static void delSchool() {
        // 1)得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);

        // 2)得到根节点
        Element root = document.getRootElement();

        // 3)得到第一个p1
        Element p1 = root.element("p1");

        // 4)得到p1下的school
        Element school = p1.element("school");

        // 5)获取school标签的父节点,然后删除school
        Element schParent = school.getParent();
        schParent.remove(school);

        // 6)回写
        Dom4jUtils.xmlWriters(Dom4jUtils.Path, document);
    }
6、使用dom4j获取属性值(使用封装类 public class Dom4jUtils )

删除p1下的属性id1的值 .attributeValue(“id1”);

步骤:
    // 1)得到document
    Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);

    // 2)得到根节点
    Element root = document.getRootElement();

    // 3)得到第一个p1
    Element p1 = root.element("p1");

    // 4)得到p1里面 id1 的属性值
    String s = p1.attributeValue("id1");

    // 5)输出属性值
    System.out.println(s);
private static void getValue() {
        // TODO Auto-generated method stub
        // 1)得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);

        // 2)得到根节点
        Element root = document.getRootElement();

        // 3)得到第一个p1
        Element p1 = root.element("p1");

        // 4)得到p1里面 id1 的属性值
        String s = p1.attributeValue("id1");

        // 5)输出属性值
        System.out.println(s);
    }

注:封装方法代码(得到文件document 和 回写xml)

    public class Dom4jUtils {

    //封装路径
    public static final String Path = "src/dom4j/p1.xml";

    // 封装得到document
    public static Document getDocument(String path) {
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(path);
            return document;
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    // 回写xml
    public static void xmlWriters(String path, Document document) {
        try {
            OutputFormat format = OutputFormat.createPrettyPrint(); // 有缩进的效果
            XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path),
                    format);
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41307491/article/details/81211753