xml系列篇之xml解析

这篇具有很好参考价值的文章主要介绍了xml系列篇之xml解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🥳🥳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.Driver

initPoolSize=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.Driver

initPoolSize=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");//里面放需要拿到对应内容的node
	for (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");//里面放需要拿到对应内容的node
	for (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文件。

              好啦,今天的分享就到这了,希望能够帮到你呢!😊😊                文章来源地址https://www.toymoban.com/news/detail-499440.html

到了这里,关于xml系列篇之xml解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Security 6.x 系列【72】授权篇之角色分层

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列Spring Security 版本 6.1.0 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo

    2024年01月23日
    浏览(41)
  • 蓝桥杯算法竞赛系列第六章——蓝桥必备篇之模拟、思维

    欢迎回到: 遇见蓝桥遇见你,不负代码不负卿! 目录 一、简单模拟 栗子:换酒问题 栗子:按奇偶排序数组 栗子:害死人不偿命的(3n+1)猜想 栗子:挖掘机技术哪家强 二、查找元素 栗子:找 x 三、图形输出 栗子:跟奥巴马一起编程 四、日期处理 栗子:日期差值 五、进

    2023年04月22日
    浏览(51)
  • Spring Security 6.x 系列【51】授权篇之动态权限规则

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列Spring Security 版本 6.1.0 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 在开始阅读本篇文档前,您需要了解以下文档的相关知识: Spring Security 6.x 系列【16】授权篇之访问控制 Spring Securi

    2024年02月07日
    浏览(50)
  • Spring Security 6.0系列【30】授权服务器篇之JOSE规范

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 本系列Spring Authorization Server 版本 1.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo

    2024年02月01日
    浏览(50)
  • Spring Security 6.0系列【14】认证篇之添加登录验证码功能

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 验证码 ( CAPTCHA )是“ Completely Automated Public Turing test to tell Computers and Humans Apart ”(全自动区分计算机和人类的图灵

    2023年04月09日
    浏览(53)
  • Spring Boot 3.0系列【23】应用篇之集成Spring WebFlux

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.4 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 官方文档地址 Spring MVC 是 Spring 专门为 Servlet API 和 Servlet 容器而设计的 Web 框架, 在 5.0 版本中加入了基于响应式的 Web 框架 Spring WebFlux ,它是完全 非阻

    2023年04月14日
    浏览(39)
  • Spring Security 6.x 系列【1】基础篇之概述及入门案例

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 本系列基于最新 Spring Boot 3.0 + Spring Security 6.0 版本,由浅入深,从实战到源码分析,详细讲解各种 Spring Security 的使用

    2024年02月06日
    浏览(55)
  • 蓝桥杯算法竞赛系列第五章——拔高篇之深度优先搜索(DFS)

    欢迎回到:遇见蓝桥遇见你,不负代码不负卿!  目录 一、引入:深度优先搜索(DFS)  二、经典例题 例题1.二叉搜索树的范围和 题目描述 题解 代码执行 例题2.岛屿数量  题目描述 题解 代码执行 例题3.背包问题 题目描述 题解 代码执行 三、思考题 四、蓝桥结语:遇见蓝

    2023年04月09日
    浏览(45)
  • Spring Security 6.0系列【15】认证篇之实现短信验证码登录功能

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 目前大部分网站都支持使用 手机号+短信验证码 登录,比

    2023年04月24日
    浏览(67)
  • SpringBoot 系列 web 篇之自定义返回 Http Code 的 n 种姿势

    虽然 http 的提供了一整套完整、定义明确的状态码,但实际的业务支持中,后端并不总会遵守这套规则,更多的是在返回结果中,加一个 code 字段来自定义业务状态,即便是后端 5xx 了,返回给前端的 http code 依然是 200 那么如果我想遵守 http 的规范,不同的 case 返回不同的

    2024年04月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包