• Dom4J解析XML、Xpath检索XML


    XML语法详解

    概述

    两种解析方式
    1.SAX解析
    2.DOM解析

    Dom常见的解析工具
    在这里插入图片描述

    DOM解析解析文档对象模型
    在这里插入图片描述

    Dom4J解析XML文件

    Dom4J官网: https://dom4j.github.io/

    实现步骤

    1.下载Dom4j框架;
    2.在项目中创建一个文件夹:lib;
    3.将dom4j-2.1.1.jar文件复制到 lib 文件夹;
    4.在jar文件上点右键,选择 Add as Library -> 点击OK;
    5.在类中导包使用;

    构造器、方法

    Dom4J的解析思想
    得到文档对象Document,从中获取元素对象和内容。

    SAXReader类

    构造器说明
    public SAXReader()创建Dom4J的解析器对象
    Document read(String url)加载XML文件成为Document对象

    Document类

    方法说明
    Element getRootElement()获得根元素对象
    List<Element> elements()得到当前元素下所有子元素
    List<Element> elements(String name)得到当前元素下指定名字的子元素返回集合
    Element element(String name)得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个
    String getName()得到元素名字
    String attributeValue(String name)通过属性名直接得到属性值
    String elementText(子元素名)得到指定名称的子元素的文本
    String getText()得到文本

    代码示例

    Dom4JDemo1.java

    public class Dom4JDemo1 {
        @Test
        public void parseXMLData() throws Exception {
            // 1、创建一个Dom4j的解析器对象,代表了整个dom4j框架
            SAXReader saxReader = new SAXReader();
    
            // 2、把XML文件加载到内存中成为一个Document文档对象
            // Document document = saxReader.read(new File("xml-app\\src\\Contacts.xml")); // 需要通过模块名去定位
            // Document document = saxReader.read(new FileInputStream("xml-app\\src\\Contacts.xml"));
    
            // 注意: getResourceAsStream中的/是直接去src下寻找的文件
            InputStream is = Dom4JDemo1.class.getResourceAsStream("/Contacts.xml");
            Document document = saxReader.read(is);
    
            // 3、获取根元素对象
            Element root = document.getRootElement();
            System.out.println(root.getName());
    
            // 4、拿根元素下的全部子元素对象(一级)
            // List<Element> sonEles =  root.elements();
            List<Element> sonEles =  root.elements("contact");
            for (Element sonEle : sonEles) {
                System.out.println(sonEle.getName());
            }
    
            // 拿某个子元素
            Element userEle = root.element("user");
            System.out.println(userEle.getName());
    
            // 默认提取第一个子元素对象 (Java语言。)
            Element contact = root.element("contact");
            // 获取子元素文本
            System.out.println(contact.elementText("name"));
            // 去掉前后空格
            System.out.println(contact.elementTextTrim("name"));
            // 获取当前元素下的子元素对象
            Element email = contact.element("email");
            System.out.println(email.getText());
            // 去掉前后空格
            System.out.println(email.getTextTrim());
    
            // 根据元素获取属性值
            Attribute idAttr = contact.attribute("id");
            System.out.println(idAttr.getName() + "-->" + idAttr.getValue());
            // 直接提取属性值
            System.out.println(contact.attributeValue("id"));
            System.out.println(contact.attributeValue("vip"));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    Contacts.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <contactList>
        <contact id="1" vip="true">
            <name>   潘金莲  </name>
            <gender></gender>
            <email>panpan@itcast.cn</email>
        </contact>
        <contact id="2" vip="false">
            <name>武松</name>
            <gender></gender>
            <email>wusong@itcast.cn</email>
        </contact>
        <contact id="3" vip="false">
            <name>武大狼</name>
            <gender></gender>
            <email>wuda@itcast.cn</email>
        </contact>
        <user>
        </user>
    </contactList>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    XML检索技术:Xpath

    XPath介绍

    XPath使用路径表达式来定位XML文档中的元素节点或属性节点,Xpath技术更加适合做信息检索。

    使用流程

    1.导入jar包(dom4j和jaxen-1.1.2.jar),Xpath技术依赖Dom4j技术;
    2.通过dom4j的SAXReader获取Document对象;
    3.利用XPath提供的API,结合XPath的语法完成选取XML文档元素节点进行解析操作;

    方法说明
    Node selectSingleNode("表达式") 获取符合表达式的唯一元素
    List<Node> selectNodes("表达式")获取符合表达式的元素集合

    Xpath的检索方法

    1.绝对路径

    /根元素/子元素/孙元素
    采用绝对路径获取从根节点开始逐层的查找节点列表并返回信息。
    从根元素开始,一级一级向下查找,不能跨级。

    2.相对路径

    ./子元素/孙元素
    先得到根节点,再采用相对路径获取下一级节点的子节点并返回信息。
    从当前元素开始,一级一级向下查找,不能跨级。

    3.全文检索

    直接全文搜索所有的指定元素并返回。
    在这里插入图片描述

    4.属性查找

    在全文中搜索属性,或者带属性的元素。
    在这里插入图片描述

    代码示例

    XPathDemo.java

    public class XPathDemo {
        /**
         1.绝对路径: /根元素/子元素/子元素。
         */
        @Test
        public void parse01() throws Exception {
            // a、创建解析器对象
            SAXReader saxReader = new SAXReader();
            // b、把XML加载成Document文档对象
            Document document =
                    saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
            // c、检索全部的名称
            List<Node> nameNodes = document.selectNodes("/contactList/contact/name");
            for (Node nameNode : nameNodes) {
                Element  nameEle = (Element) nameNode;
                System.out.println(nameEle.getTextTrim());
            }
        }
    
        /**
         2.相对路径: ./子元素/子元素。 (.代表了当前元素)
         */
        @Test
        public void parse02() throws Exception {
            // a、创建解析器对象
            SAXReader saxReader = new SAXReader();
            // b、把XML加载成Document文档对象
            Document document =
                    saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
            Element root = document.getRootElement();
            // c、检索全部的名称
            List<Node> nameNodes = root.selectNodes("./contact/name");
            for (Node nameNode : nameNodes) {
                Element  nameEle = (Element) nameNode;
                System.out.println(nameEle.getTextTrim());
            }
        }
    
        /**
         3.全文搜索:
         //元素  在全文找这个元素
         //元素1/元素2  在全文找元素1下面的一级元素2
         //元素1//元素2  在全文找元素1下面的全部元素2
         */
        @Test
        public void parse03() throws Exception {
            // a、创建解析器对象
            SAXReader saxReader = new SAXReader();
            // b、把XML加载成Document文档对象
            Document document =
                    saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
            // c、检索数据
            //List<Node> nameNodes = document.selectNodes("//name");
            // List<Node> nameNodes = document.selectNodes("//contact/name");
            List<Node> nameNodes = document.selectNodes("//contact//name");
            for (Node nameNode : nameNodes) {
                Element  nameEle = (Element) nameNode;
                System.out.println(nameEle.getTextTrim());
            }
        }
    
        /**
         4.属性查找。
         //@属性名称  在全文检索属性对象。
         //元素[@属性名称]  在全文检索包含该属性的元素对象。
         //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象。
         */
        @Test
        public void parse04() throws Exception {
            // a、创建解析器对象
            SAXReader saxReader = new SAXReader();
            // b、把XML加载成Document文档对象
            Document document =
                    saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
            // c、检索数据
            List<Node> nodes = document.selectNodes("//@id");
            for (Node node : nodes) {
                Attribute attr = (Attribute) node;
                System.out.println(attr.getName() + "===>" + attr.getValue());
            }
    
            // 查询name元素(包含id属性的)
    //      Node node = document.selectSingleNode("//name[@id]");
            Node node = document.selectSingleNode("//name[@id=888]");
            Element ele = (Element) node;
            System.out.println(ele.getTextTrim());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88

    Contacts2.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <contactList>
        <contact id="1" vip="true">
            <name>   潘金莲  </name>
            <gender></gender>
            <email>panpan@itcast.cn</email>
        </contact>
        <contact id="2" vip="false">
            <name>武松</name>
            <gender></gender>
            <email>wusong@itcast.cn</email>
        </contact>
        <contact id="3" vip="false">
            <name>武大狼</name>
            <gender></gender>
            <email>wuda@itcast.cn</email>
        </contact>
        <user>
            <contact>
                <info>
                    <name id="888">我是西门庆</name>
                </info>
             </contact>
        </user>
    </contactList>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    江川第一镰启动仪式 国稻种芯:北大荒2300余万亩水稻收获
    什么是虚拟主播?虚拟数字人直播,不用出镜,不用露脸的直播方式
    Android Studio的下载安装与使用
    Centos Discuz!论坛系统
    12P2532X162-233A KJ3222X1-BA1 CE4003S2B3 EMERSON CONTROLLER
    Protobuf的使用,结合idea
    Linux-9-信号
    Day20_脚手架,分析脚手架结构,render()函数
    JAVA基础——编译器报告的错误信息总结
    携创教育:最新!2022年10月自考报名时间已全部公布
  • 原文地址:https://blog.csdn.net/weixin_52341477/article/details/125560159