XML解析文档解析

1.首先是我的项目结构以及我所引入的依赖:

2.引入的依赖:jdk用的是17

<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <!--做xml的解析-->
    <dependency>
        <groupId>jaxen</groupId>
        <artifactId>jaxen</artifactId>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

3.测试代码如下:

public class TestMybatis {

    @Test
    public void testPorerXml() throws DocumentException {
        SAXReader saxReader=new SAXReader();
        InputStream resourceAsStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-conf.xml");
        Document read = saxReader.read(resourceAsStream);
        System.out.println("read = " + read);
        String xPath="/configuration/environments";
          Element  node =(Element) read.selectSingleNode(xPath);
        String node1 = node.attributeValue("default");
        System.out.println("node1 = " + node1);
        String xPath1="/configuration/environments/environment[@id='"+node1+"']";
        System.out.println("xPath1 = " + xPath1);
        Element ele = (Element) read.selectSingleNode(xPath1);
        System.out.println("ele = " + ele);
        Element transactionManager = ele.element("transactionManager");
        String transactionManager1 = transactionManager.attributeValue("type");
        System.out.println("transactionManager1 = " + transactionManager1);
        Element dataSource = ele.element("dataSource");
        String pooled = dataSource.attributeValue("type");
        System.out.println("pooled = " + pooled);
        List<Element> elements = dataSource.elements();
        elements.forEach(elem->{
            String name = elem.attributeValue("name");
            String value = elem.attributeValue("value");
            System.out.println("name = " + name+"-----"+"value = " + value);
        });

        String xpaht2="//mapper";
        List<Element> list = read.selectNodes(xpaht2);
        for (Element l:list) {
            System.out.println("l = " + l);
            String resource = l.attributeValue("resource");
            System.out.println("resource = " + resource);
        }
    }


    @Test
    public void testAdminXml() throws DocumentException {
        SAXReader saxReader=new SAXReader();
        InputStream resourceAsStream = ClassLoader.getSystemClassLoader().getResourceAsStream("AdminMapper.xml");
        Document document = saxReader.read(resourceAsStream);
        String path="/mapper";
        Element element = (Element) document.selectSingleNode(path);
        String namespace = element.attributeValue("namespace");
        System.out.println("namespace = " + namespace);
        List<Element> elements = element.elements();
        elements.forEach(elem->{
            String id = elem.attributeValue("id");
            System.out.println("id = " + id);
            String useGeneratedKeys = elem.attributeValue("useGeneratedKeys");
            System.out.println("useGeneratedKeys = " + useGeneratedKeys);
            String keyProperty = elem.attributeValue("keyProperty");
            System.out.println("keyProperty = " + keyProperty);
            String resultType = elem.attributeValue("resultType");
            System.out.println("resultType = " + resultType);
            String resultMapper = elem.attributeValue("resultMap");
            System.out.println("resultMapper = " + resultMapper);
            String textTrim = elem.getTextTrim();
            System.out.println("textTrim = " + textTrim);
            String s = textTrim.replaceAll("#\\{[0-9A-Za-z_$]*}", "?");
            System.out.println("s = " + s);
        });

    }
}

4.说说每一个方法用来做什么,具体的作用:

SAXReader saxReader=new SAXReader();
InputStream resourceAsStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-conf.xml");
Document read = saxReader.read(resourceAsStream);

0.SAX解析器读取位于类路径下的名为"mybatis-conf.xml"的XML文件,并将其解析为一个Document对象。其中,SAXReader是一个SAX解析器,
InputStream resourceAsStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-conf.xml")用于获取mybatis-conf.xml文件的输入流,
Document read = saxReader.read(resourceAsStream)则是将输入流解析为一个Document对象:

1. Element  node =(Element) read.selectSingleNode(xPath);:根据XPath表达式获取mybatis-conf.xml文件中的根节点,即<configuration>节点。

2. String node1 = node.attributeValue("default");:获取<configuration>节点的default属性值,该属性值用于指定默认的环境(即数据库)。

3. String xPath1="/configuration/environments/environment[@id='"+node1+"']";:根据default属性值构造XPath表达式,用于获取指定id的<environment>节点。

4. Element ele = (Element) read.selectSingleNode(xPath1);:根据XPath表达式获取指定id的<environment>节点。

5. Element transactionManager = ele.element("transactionManager");:获取<environment>节点下的<transactionManager>节点。

6. String transactionManager1 = transactionManager.attributeValue("type");:获取<transactionManager>节点的type属性值,即事务管理器的类型。

7. Element dataSource = ele.element("dataSource");:获取<environment>节点下的<dataSource>节点,即数据库连接池配置信息。

8. String pooled = dataSource.attributeValue("type");:获取<dataSource>节点的type属性值,即数据库连接池的类型。

9. List<Element> elements = dataSource.elements();:获取<dataSource>节点下的所有子节点,即数据库连接池的配置信息。

10. elements.forEach(elem->{}:遍历数据库连接池的配置信息,获取每个子节点的name和value属性值。

11. String xpaht2="//mapper";:构造XPath表达式,用于获取所有<mapper>节点。

12. List<Element> list = read.selectNodes(xpaht2);:根据XPath表达式获取所有<mapper>节点。

13. for (Element l:list) {}:遍历所有<mapper>节点,获取每个节点的resource属性值,即mapper文件的路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/123600.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【uniapp】通用列表封装组件

uniapp页面一般都会有像以下的列表页面&#xff0c;封装通用组件&#xff0c;提高开发效率&#xff1b; &#xff08;基于uView前端框架&#xff09; 首先&#xff0c;通过设计图来分析一下页面展示和数据结构定义 w-table组件参数说明 参数说明类型可选值默认值toggle列表是…

读者自荐的 4 个 GitHub 项目

本期推荐的 4 个开源项目&#xff0c;为读者在开源项目 Awesome-GitHub-Repo 的评论区自推的, 如果你开源了不错的项目&#xff0c;想让大家看到&#xff0c;也可以去 Awesome-GitHub-Repo 进行投稿。 本期推荐开源项目目录&#xff1a; 1. DB-GPT 2. 定制中国传统节日头像 3. …

零代码编程:用ChatGPT批量将Mp4视频转为Mp3音频

文件夹中有很多mp4视频文件&#xff0c;如何利用ChatGPT来全部转换为mp3音频呢&#xff1f; 在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个批量将Mp4视频转为Mp3音频的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;…

Vue el-table序号与复选框hover切换

效果图下&#xff1a; <template><div class"container"><el-tableref"multipleTable"id"multipleTable":data"person.tableData"cell-mouse-enter"cellEnter"cell-mouse-leave"cellLeave"selecti…

网页【CSS】滚动条

前言 优化后的滚动条会提亮我们的网站页面。 例如&#xff1a;CSS-TRICKS这个网站如果采用的是浏览器默认的滚动条&#xff0c;不进行优化&#xff0c;页面会显得很不搭。 所以该网站的滚动条样式优化如下&#xff1a; html::-webkit-scrollbar {width: 30px;height: 30px; …

Leetcode---370周赛

题目列表 2923. 找到冠军 I 2924. 找到冠军 II 2925. 在树上执行操作以后得到的最大分数 2926. 平衡子序列的最大和 一、找到冠军I 第一题模拟题&#xff0c;简单来说是看每一行(列)是否全是1&#xff0c;当然不包括自己比自己强的情况&#xff0c;需要特判 代码如下 …

支持C#的开源免费、新手友好的数据结构与算法入门教程 - Hello算法

前言 前段时间完成了C#经典十大排序算法&#xff08;完结&#xff09;然后有很多小伙伴问想要系统化的学习数据结构和算法&#xff0c;不知道该怎么入门&#xff0c;有无好的教程推荐的。今天给大家推荐一个支持C#的开源免费、新手友好的数据结构与算法入门教程&#xff1a;He…

STM32Cube +VSCode开发环境搭建

STM32Cube VSCode开发环境搭建 0.前言一、各种方式对比1.STM32CubeMX CLion2.STM32CubeIDE VSCode STM32 VSCode Extension3.VSCode EIDE插件 二、STM32CubeIDE VSCode STM32 VSCode Extension环境搭建1.需要安装的软件2.相关配置3.编译测试 三、总结 0.前言 工欲善其事&…

Qt QtCreator调试Qt源码配置

目录 前言1、编译debug版Qt2、QtCreator配置3、调试测试4、总结 前言 本篇主要介绍了在麒麟V10系统下&#xff0c;如何编译debug版qt&#xff0c;并通过配置QtCreator实现调试Qt源码的目的。通过调试源码&#xff0c;我们可以对Qt框架的运行机制进一步深入了解&#xff0c;同时…

HTML_案例1_注册页面

用纯html页面&#xff0c;不用css画一个注册页面。 最终效果如下&#xff1a; html页面代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> </head>…

【Git】Git安装入门使用常用命令Gitee远程仓库上传文件与下载

一&#xff0c;Git入门 1.1 Git是什么 Git是一款分布式版本控制系统&#xff0c;被广泛用于软件开发中的源代码管理。它由Linus Torvalds在2005年创造并发布&#xff0c;旨在解决传统版本控制系统&#xff08;如SVN&#xff09;的一些局限性。主要用于敏捷高效地处理任何或小或…

【解决方案】vue 项目 npm run dev 时报错:‘cross-env‘ 不是内部或外部命令,也不是可运行的程序

报错 cross-env 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! estate1.0.0 dev: cross-env webpack-dev-server --inline --progress --config build/webpack.dev.conf.js npm ERR! Exit status 1 np…

Pytorch 里面torch.no_grad 和model.eval(), model.train() 的作用

torch.no_grad: 影响模型的自微分器&#xff0c;使得其停止工作&#xff1b;这样的话&#xff0c;数据计算的数据就会变快&#xff0c;内存占用也会变小&#xff0c;因为没有了反向梯度计算&#xff0c;当然&#xff0c;我哦们也无法做反向传播。 model.eval() 和model.train()…

Dockerfile搭建lnmp

目录 任务需求&#xff1a; 一、准备&#xff1a; 二、部署nginx容器&#xff08;172.18.0.10&#xff09;&#xff1a; 1.编写Dockerfile构建镜像&#xff1a; 2.准备nginx配置文件&#xff1a; 3.构建镜像&#xff0c;启动nginx容器&#xff1a; 三、部署mysql容器&#x…

Flutter学习:使用CustomPaint绘制路径

Flutter学习&#xff1a;认识CustomPaint组件和Paint对象 Flutter学习&#xff1a;使用CustomPaint绘制路径 Flutter学习&#xff1a;使用CustomPaint绘制图形 Flutter学习&#xff1a;使用CustomPaint绘制文字 Flutter学习&#xff1a;使用CustomPaint绘制图片 drawPath 绘制路…

矢量绘图软件Sketch 99 for mac

Sketch是一款为用户提供设计和创建数字界面的矢量编辑工具。它主要用于UI/UX设计师、产品经理和开发人员&#xff0c;帮助他们快速设计和原型各种应用程序和网站。 Sketch具有简洁直观的界面&#xff0c;以及丰富的功能集&#xff0c;使得用户可以轻松地创建、编辑和共享精美的…

C++ vector 动态数组的指定元素删除

文本旨在对 C 的容器 vector 进行肤浅的分析。 文章目录 Ⅰ、vector 的指定元素删除代码结果与分析 Ⅱ、vector 在新增元素后再删除指定元素代码结果与分析 Ⅲ、vector 在特定条件下新增元素代码结果与分析 参考文献 Ⅰ、vector 的指定元素删除 代码 #include <iostream&g…

Python语言:经典例题分析讲解

题1&#xff1a; 通过观察我们可以得出以下结论&#xff1a; 代码实现&#xff1a; """ &#xff08;3&#xff09;输入整数n&#xff0c;输出n行的字符图案。如n5时输出以下图案&#xff1a;* *** ***** ******* *********""""" for…

河南开放大学与电大搜题微信公众号:携手共进,助力学习之路

作为河南省内颇具影响力和声誉的高等教育机构之一&#xff0c;河南开放大学一直致力于提供优质的教育资源和灵活的学习方式&#xff0c;以满足广大学习者的需求。而在这个追求知识的时代&#xff0c;学习者们尤其需要一个便捷、高效的工具来辅助学习。电大搜题微信公众号应运而…

python编程复习系列——week2(Input Output (2))

文章目录 一、多行代码语句二、Escape序列三、字符串格式四、数值运算课后作业 一、多行代码语句 &#x1f95e;使用反斜杠\来表示在下一行中继续使用一条语句。 subject_code "CSCI111" subject_mark 80 subject_grade "D" result "Subject re…