• 暑期JAVA学习(48)XML检索技术:Xpath


    一、XPath引入

    如果需要从XML文件中检索需要的某个信息(如name)怎么解决?

    • Dom4j需要进行文件的全部解析,然后再寻找数据
    • Xpath技术更加适合做信息检索

    二、XPath介绍

    • XPath在解析XML文档方面提供了一独树一帜的路径思想,更加优雅,高效
    • XPath使用路径表达式来定位XML文档中的元素节点或属性节点。

    示例:

    • /元素/子元素/孙元素
    • //子元素//孙元素

    三、使用Xpath检索出XML文件

    需求
    • 使用Dom4J把一个XML文件的数据进行解析
    分析
    ①导入jar包(dom4j和jaxen-1.1.2.jar),Xpath技术依赖Dom4j技术
    • 复制jaxen-1.1.2.jar
      在这里插入图片描述
    • 粘贴

      在这里插入图片描述
    • 将jaxen-1.1.2.jar添加到库
      在这里插入图片描述
      在这里插入图片描述
    ②通过dom4j的SAXReader获取Document对象
    ③利用XPath提供的API,结合XPath的语法完成选取XML文档元素节点进行解析操作
    ④Document中与Xpath相关的API如下
    方法名说明
    Node selectSingleNode(“表达式”)获取符合表达式的唯一元素
    List< Node> selectNodes(“表达式”)获取符合表达式的元素集合

    四、Xpath的四大检索方案

    ①绝对路径
    • 采用绝对路径获取从根节点开始逐层的查找/contactList/contact/name节点列表并打印信息
    方法名说明
    /根元素/子元素/孙元素从根元素开始,一级一级向下查找,不能跨级
    ②相对路径
    • 先得到根节点contactList
    • 再采用相对路径获取下一级contact 节点的name子节点并打印信息
    方法名说明
    /子元素/孙元素从当前元素开始,一级一级向下查找,不能跨级
    ③全文检索
    • 直接全文搜索所有的name元素并打印
    方法名说明
    //contact找contact元素,无论元素在哪里
    //contact/name找contact,无论在哪一级,但name一定是contact的子节点
    //contact//namecontact无论在哪一种,name只要是contact的子孙元素都可以找到
    ④属性查找
    • 在全文中搜索属性,或者带属性的元素
    方法名说明
    //@属性名查找属性对象,无论是哪个元素,只要有这个属性即可
    //元素[@属性名]查找元素对象,全文搜索指定元素名和属性名
    //元素[@属性名=‘值’]查找元素对象,全文搜索指定元素名和属性名,并且属性值相等

    五、具体实现

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    
    
        
               潘金莲  
            
        
        
            武松
            
        
        
            武大郎
            
        
        
            
                
                    我是西门庆
                
             
        
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    /**
     目标:XPath检索XML中的信息啊。(了解)
    
     引入:
     Dom4J可以用于解析整个XML的数据。
     但是如果要检索XML中的某些信息,建议使用XPath.(Xpath依赖Dom4j技术)
     Dom4J用于解析数据,Xpath用于检索数据。
     XPath使用步骤:
     1.导入dom4j框架。(XPath依赖于Dom4j技术,必须先导入dom4j框架!)
     2.导入XPath独有的框架包。jaxen-1.1.2.jar
     XPath常用API:
     List selectNodes(String var1):检索出一批节点集合。
     Node selectSingleNode(String var1):检索出一个节点返回。
     XPath提供的四种检索数据的写法:
     1.绝对路径。
     2.相对路径。
     3.全文搜索。
     4.属性查找。
     小结:
     1.绝对路径: /根元素/子元素/子元素。
     2.相对路径: ./子元素/子元素。 (.代表了当前元素)
     3.全文搜索:
     //元素  在全文找这个元素
     //元素1/元素2  在全文找元素1下面的一级元素2
     //元素1//元素2  在全文找元素1下面的全部元素2
     4.属性查找。
     //@属性名称  在全文检索属性对象。
     //元素[@属性名称]  在全文检索包含该属性的元素对象。
     //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象。
     */
    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 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 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 nameNodes1 = document.selectNodes("//name");
            for (Node nameNode : nameNodes1) {
                Element nameEle = (Element) nameNode;
                System.out.println(nameEle.getTextTrim());
            }
            List nameNodes2 = document.selectNodes("//contact/name");
            for (Node nameNode : nameNodes2) {
                Element nameEle = (Element) nameNode;
                System.out.println(nameEle.getTextTrim());
            }
            List nameNodes3 = document.selectNodes("//contact//name");
            for (Node nameNode : nameNodes3) {
                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 nodes = document.selectNodes("//@id");
            for (Node node : nodes) {
                Attribute attr = (Attribute) node;
                System.out.println(attr.getName() + "===>" + attr.getValue());
            }
    
            // 查询name元素(包含id属性的)
            Node node1 = document.selectSingleNode("//name[@id]");
            Element ele1 = (Element) node1;
            System.out.println(ele1.getTextTrim());
            Node node2 = document.selectSingleNode("//name[@id=888]");
            Element ele2 = (Element) node2;
            System.out.println(ele2.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
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125

    六、总结

    Xpath作用,四大类

    • 检索XML文件中的信息
    • 绝对路径: /根元素/子元素/孙元素
    • 相对路径:./子元素/孙元素
    • 全文检索://contact
    • 属性查找://@属性名 、//元素[@属性名]、//元素[@属性名=‘值’]
  • 相关阅读:
    字符串函数以及内存函数的模拟实现(超详细,全面理解字符串函数!!!)
    2024-04-19 问AI: 介绍一下 Frobenius norm 在深度学习中的应用
    Java学习笔记 --- Java绘图技术
    Nginx静态资源部署之响应内容部署
    CAS真的无锁吗
    论文阅读 Exploring Temporal Information for Dynamic Network Embedding
    python随手小练4
    [vue] .sync实现父子组件的双向绑定数据
    (第一天:)1.字典赋值默认值、字典解压赋值
    C++ Primer学习笔记-----第二章:变量和基本类型
  • 原文地址:https://blog.csdn.net/xjl243636988/article/details/126396157