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 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文件



	
		小明
	
	
		小芳
	
	
		小王
	

代码示例

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 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文件。

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

你可能感兴趣的:(xml,xml,数据结构)