xml系列篇之xml解析

news/2024/11/13 3:37:34/

🥳🥳Welcome Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于xml的相关操作吧

目录

🥳🥳Welcome Huihui's Code World ! !🥳🥳

是什么

为什么要使用

优点

💡辉辉小贴士:xml在数据库辅助类中的应用

💡辉辉小贴士:怎么获取不同位置下的配置文件呢?

怎么使用

1.DOM4J

代码示例

2. XPath

代码示例

3. SAX

4. StAX

5. JAXB


是什么

  • XML解析(XML parsing)是指将XML文件中的数据解析并转换成计算机程序中可以处理的格式的过程。在XML中,数据被存储为标签和元素的组合,这些标签和元素本质上是一些文本字符串。XML解析器(XML parser)可以读取这些字符串并将它们转换为计算机程序能够使用的数据类型,如字符串、整数、浮点数、日期等。通过XML解析,程序可以方便地访问和操作XML文件中的数据

为什么要使用

优点

        1. 可读性强

                XML文件使用标签来区分不同的元素,具有良好的可读性和可维护性,有助于开发人员理解和处理XML文件。

        2. 结构化数据

                XML提供了一种方式来描述数据的结构和层次结构,有助于开发人员在处理复杂数据结构时强制执行数据结构和约束条件。

        3. 跨平台和通用性强

                由于XML采用标准化格式,它具有跨平台和通用性强的优势,可以与不同平台、不同环境和不同开发语言进行交互。

        4. 改善数据处理效率

                在大量数据需要被处理时,使用XML解析器可以大大提高开发效率。XML解析器将XML文件解析为对象模型或者树状结构,可以轻松地对其进行访问、修改和转换,方便了数据的处理和管理。

⭐⭐总之,使用XML解析可以方便地读取和处理XML文件中的数据,并提高数据处理的效率和可靠性

文字的说服力俨然比不上代码,那么话不多说,我们直接看代码

💡辉辉小贴士:xml在数据库辅助类中的应用

        下面是我们常写的数据库辅助类的代码

        这样写会产生一个问题,那就是会有局限性,如果在后期我的数据库密码或者是用户名更改了,那么我就需要将已经编译生成的class文件进行反编译,再次生成java文件之后,对里面的用户名和密码进行修改,是不是听起来都特别麻烦?

package com.wh.parse;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;/*** 数据库辅助类* * @author W**/
public class DBUtils {/*** 加载驱动*/static {try {Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");System.out.println("驱动加载完成😊😊");} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 创建连接* * @return*/public static Connection getcon() {Connection con = null;try {con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=Movie;", "sa", "123");} catch (Exception e) {e.printStackTrace();}return con;}/*** 关闭资源* * @param con* @param ps* @param rs*/public static void myclose(Connection con, PreparedStatement ps, ResultSet rs) {try {if (rs != null) {rs.close();}if (ps != null) {ps.close();}if (con != null && !con.isClosed()) {con.close();}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {System.out.println(new DBUtils());}}

那么这时,我们可以将配置文件运用到数据库辅助类中【properties文件】

#oracle9i
#driver=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:orcl
#user=scott
#pwd=***#sql2005
#driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
#url=jdbc:sqlserver://localhost:1433;DatabaseName=test1
#user=sa
#pwd=***#sql2000
#driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
#url=jdbc:microsoft:sqlserver://localhost:1433;databaseName=unit6DB
#user=sa
#pwd=***#mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8&useSSL=false
user=root
pwd=***

可以看到,里面都是需要连接第三方软件的用户名,密码,url...

这样写的话,会更加安全后期修改起来也更为方便

那么我们的DBUtils也会变得更加的方便!!👇👇

package com.wh.parse;import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;/*** 提供了一组获得或关闭数据库对象的方法* */
public class DBUtils {private static String driver;private static String url;private static String user;private static String password;static {// 静态块执行一次,加载 驱动一次try {InputStream is = DBUtils.class.getResourceAsStream("config.properties");Properties properties = new Properties();properties.load(is);driver = properties.getProperty("driver");url = properties.getProperty("url");user = properties.getProperty("user");password = properties.getProperty("pwd");Class.forName(driver);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}/*** 获得数据连接对象* * @return*/public static Connection getConnection() {try {Connection conn = DriverManager.getConnection(url, user, password);return conn;} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}public static void close(ResultSet rs) {if (null != rs) {try {rs.close();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}}public static void close(Statement stmt) {if (null != stmt) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}}public static void close(Connection conn) {if (null != conn) {try {conn.close();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}}public static void close(Connection conn, Statement stmt, ResultSet rs) {close(rs);close(stmt);close(conn);}public static boolean isOracle() {return "oracle.jdbc.driver.OracleDriver".equals(driver);}public static boolean isSQLServer() {return "com.microsoft.sqlserver.jdbc.SQLServerDriver".equals(driver);}public static boolean isMysql() {return "com.mysql.jdbc.Driver".equals(driver);}public static void main(String[] args) {Connection conn = DBUtils.getConnection();DBUtils.close(conn);System.out.println("isOracle:" + isOracle());System.out.println("isSQLServer:" + isSQLServer());System.out.println("isMysql:" + isMysql());System.out.println("数据库连接(关闭)成功");}
}

💡辉辉小贴士:怎么获取不同位置下的配置文件呢?

由于xml的配置文件有多个储存位置,因此我们也要有相对应的获取不同存放位置下的xml配置文件的方法

首先看一个properties文件

uname=mybatis_ssm
upass=xiaoli
url=jdbc:mysql://localhost:3306/mybatis_ssm
driver_Class=com.mysql.jdbc.DriverinitPoolSize=5
maxPoolSize=20
  • 配置文件的存放位置
    • 同包
      • InputStream in = Demo1.class.getResourceAsStream("db.properties");//获取流Properties p = new Properties();//拿到Properties工具类对象p.load(in);//加载配置文件内容所对应的流System.out.println(p.getProperty("url"));//jdbc:mysql://localhost:3306/mybatis_ssm
    • 根目录               
      •  InputStream in = Demo1.class.getResourceAsStream("/db.properties");//获取流Properties p = new Properties();//拿到Properties工具类对象p.load(in);//加载配置文件内容所对应的流System.out.println(p.getProperty("url"));// jdbc:mysql://localhost:3306/mybatis_ssm

    • 安全路径【也就是WEB-INF下的位置】
      • package com.wh.parse;import java.io.IOException;
        import java.io.InputStream;import javax.servlet.ServletException;
        import javax.servlet.annotation.WebServlet;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;import java.util.Properties;@WebServlet("/WebinfServlet")
        public class WebinfServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {InputStream in = request.getServletContext().getResourceAsStream("/WEB-INF/db.properties");//获取流Properties p = new Properties();//拿到Properties工具类对象p.load(in);//加载配置文件内容所对应的流System.out.println(p.getProperty("url"));// jdbc:mysql://localhost:3306/mybatis_ssm}}
        

怎么使用

1.DOM4J

DOM4J是一个开放源代码的Java库,是对标准DOM(文档对象模型)的一种扩展。DOM4J提供了灵活的API,使XML文档的创建、读取、更新、删除等操作变得更加易于处理。相较于标准DOM,DOM4j的处理速度更快,内存占用较少,而且它的API接口更加简洁、易于使用,能够大大提高开发效率

在 SAXReader 中,获取 XML 节点通常使用 Element 类的方法。以下是常用的获取节点方法:

 

dom4j中的常用方法
getRootElement()获取文档的根元素
element(String name)获取指定名称的第一个子元素
elements()获取所有子元素的迭代器
elements(String name)获取指定名称的所有子元素的迭代器
attribute(String name)获取指定名称的属性
attributeValue(String name)获取指定名称的属性的值
getText()获取元素的纯文本内容
getQualifiedName()获取元素的限定名(包含命名空间前缀)
getName()获取元素的名称(不包含命名空间前缀)
getPath()获取元素的路径(包含命名空间前缀)
selectNodes(String xpathExpression)根据 XPath 表达式获取所有匹配的节点列表
selectSingleNode(String xpathExpression)根据 XPath 表达式获取单个匹配的节点

首先看一个xml文件

uname=mybatis_ssm
upass=xiaoli
url=jdbc:mysql://localhost:3306/mybatis_ssm
driver_Class=com.mysql.jdbc.DriverinitPoolSize=5
maxPoolSize=20

代码示例

package com.wh.parse;import java.io.InputStream;
import java.util.List;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;public class Demo2 {/*** 	3.怎么学习xml的解析* xml有多个存放位置,我们需要通过相应的代码获取对应位置的xml文件* 获取了文件之后,我们有时还需要获取xml文件的内容* 那么或许文件内容有多个方法,我们学习的是简便的方式,提高效率!!* @throws Exception */
public static void main(String[] args) throws Exception {InputStream in =Demo2.class.getResourceAsStream("students.xml");//获取流SAXReader sr= new SAXReader();Document read = sr.read(in);//读流
//	System.out.println(read.asXML());//拿到整个文件的内容List<Element> selectNodes = read.selectNodes("/students/student");//里面放需要拿到对应内容的nodefor (Element element : selectNodes) {System.out.println(element.asXML());//拿到所有节点Element name  = (Element) element.selectSingleNode("name");System.out.println(name.asXML());//拿到单个节点System.out.println(name.getText());//拿到标签中的内容System.out.println(element.attributeValue("sid"));//拿到标签的属性值}
}
}

再来说说DOM4J的主要特点

1. 支持XPath

        DOM4J支持XPath语法,能够很方便地遍历和修改XML文档中的元素和属性。

2. 高效性能

        DOM4J使用快速且内存占用较少的观察者模式访问XML文档,能够在大型XML文档的处理中达到更高的性能

3. 适用于多文档处理

        DOM4J支持同时处理多个XML文档以及并发操作,能够高效地处理多种数据格式的XML文档。

4. 支持XML Schema验证

        DOM4J支持XML Schema验证,能够帮助开发人员确保XML文档的有效性和完整性。

5. 提供了多种扩展机制

        DOM4J提供了多种扩展机制,如Namespace、ProcessingInstruction、CDATA等,支持对XML文档进行扩展处理

2. XPath

        XPath是一种使用路径表达式(类似于文件路径)在XML文档中寻找信息的语言,它可以帮助程序员精确定位XML文档中的节点。

先看一个xml文件

<?xml version="1.0" encoding="UTF-8"?>
<students><student sid="s001"><name>小明</name></student><student sid="s002"><name>小芳</name></student><student sid='s003'><name>小王</name></student>
</students>

代码示例

package com.wh.parse;import java.io.InputStream;
import java.util.List;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;/*** 用xpath的方式解析xml* @author W**/
public class Demo3 {
public static void main(String[] args) throws Exception {InputStream in =Demo2.class.getResourceAsStream("students.xml");//获取流SAXReader sr= new SAXReader();Document read = sr.read(in);//读流//拿到students节点下的student中的id属性值为s003的name标签的文本并输出List<Element> selectNodes = read.selectNodes("/students/student");//里面放需要拿到对应内容的nodefor (Element element : selectNodes) {if(element.attributeValue("sid").equals("s003")) {Element name = (Element) element.selectSingleNode("name");System.out.println(name.getText());//小王}}//上述代码太过冗余,接下来让我们看看更为简便的xpath解析xml文件Element element=(Element) read.selectSingleNode("/students/student[@sid='s003']/name");System.out.println(element.getText());//小王
}
}

3. SAX

        SAX(Simple API for XML)是一种基于事件驱动的XML解析方式。在SAX解析XML文件时,解析器不需要将整个XML文件读入内存并解析为一个树形结构,而是边解析边读入XML文件,当解析器遇到XML文件中的某个节点时,就触发相应的事件。

4. StAX

        StAX(Streaming API for XML)是一种基于拉模型的XML解析方式。StAX解析器将XML文件视为一个流,有两种模式:事件迭代模式和游标模式。在事件迭代模式中,应用程序通过调用解析器提供的next()方法来逐个访问XML节点;在游标模式中,应用程序可以以类似于JDBC结果集的方式访问XML节点。

5. JAXB

        JAXB(Java Architecture for XML Binding)是一种将XML文档绑定到Java对象上的方法,它可以将XML文件解析成Java对象,并将Java对象序列化为XML文件。

              好啦,今天的分享就到这了,希望能够帮到你呢!😊😊                


http://www.ppmy.cn/news/543130.html

相关文章

双系统linux触摸板不能用,windows系统与ubuntu双系统导致笔记本触摸板失灵的解决办法(非输入代码)...

先说一下我现在的笔记本使用的系统&#xff0c;windows10 64位&#xff0b;ubuntu14.04 64位。 这几天把ubuntu装好后本来毫无问题的&#xff0c;用的飞起&#xff5e;可是昨天不知道什么原因&#xff0c;触摸板突然失灵了&#xff0c;插上鼠标可以用&#xff0c;就是触摸板不能…

【笔记本触摸板失灵】终极解决办法

我的电脑之前重新装机以后突然触摸板不能用&#xff0c;所有网上的方法全部试一遍&#xff0c;都不行&#xff0c;用鼠标苦b的支撑半年&#xff0c;内心be like。。。。。 &#xff08;我的电脑甚至是触屏的&#xff0c;也不能用&#xff09; 今天突然解决了救命&#xff0c;发…

win10 电脑触摸板不能滑动_win10系统笔记本触摸板只能移动鼠标不能点击使用的处理办法...

win10系统笔记本触摸板只能移动鼠标不能点击使用的处理办法? win10系统有很多人都喜欢使用,我们操作的过程中常常会碰到win10系统笔记本触摸板只能移动鼠标不能点击使用的问题。如果遇到win10系统笔记本触摸板只能移动鼠标不能点击使用的问题该怎么办呢?很多电脑水平薄弱的网…

学计算机买什么电脑性价比高,台式电脑性价比那么高,为什么我还推荐大学生买笔记本?...

最近总在朋友的电脑店里面晃悠&#xff0c;准确来说就是自己想换电脑了。恰逢十一&#xff0c;很多大学生放假回来都打算买电脑。一般家长领着来的大学生都考虑买的是台式机&#xff0c;因为性价比够高&#xff0c;同样的价格可能买笔记本只能选个够用的&#xff0c;但是买台式…

记录一下通过QQ发送apk安装失败原因。

昨天测试反馈说&#xff0c;有个手机安装失败&#xff0c;其他手机都是正常。随即我问了一下他是不是通过QQ发送的&#xff0c;得到了肯定的回答&#xff0c;这里给大家说下&#xff0c;qq发送文件会把后缀名改掉&#xff0c;手机识别不了这是个apk文件&#xff0c;自然无法解析…

如何在centos7中安装QQ

如何在centos7中安装QQ 1、在官网选择Linux版本&#xff0c;即【QQ for Linux】&#xff1b;并选择x64架构的rpm包进行下载。 2、将下载的rpm包导入centos操作系统&#xff08;直接在centos操作系统内下载也可以&#xff09; 3、执行以下命令进行安装 rmp -ivh linuxqq_2…

archlinux安装QQ微信

工作与生活中还是很难离开QQ和微信这两款软件的&#xff0c;那么想把archlinux作为主力系统的用户&#xff0c;应该如果安装QQ和微信呢&#xff1f; 开启 32 位支持库与 ArchLinuxCN 支持库 vim /etc/pacman.conf去掉[multilib]一节中两行的注释&#xff0c;来开启 32 位库支…

ubuntu18.04 安装 腾讯qq

ubuntu18.04安装腾讯qq 1.百度搜索&#xff1a;qq 2.进入链接&#xff0c;点击下载&#xff1a; 3.下载 QQ for Linux 版本&#xff1a; 4.根据使用的系统的架构和linux发行版本选择合适的安装包&#xff1a; 5.不知道的自己系统架构的使用,一下的命令查看&#xff1a; …