J2EE之XML解析(超详细)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: J2EE之XML解析(超详细)


1.前言

1.1配置文件是什么

配置文件是一种特殊的XML文件,它被用于存储程序或系统的配置信息。顾名思义,就是可以存储各种配置参数、选项以及设置,用于告诉程序或系统如何运行、如何连接网络、如何访问硬件资源,用来做配置的文件,常见的后缀名有:

.xml   .config   .properties   .json   .yml   .ini等。

1.2为什么要用到配置文件

①配置文件可以作为程序或系统的常规配置文件,放置在固定的路径下,方便用户和管理员查看和修改

②配置文件在程序或系统启动时被加载和解析,程序或系统可以根据需要动态修改配置文件,如更改服务器端口号、连接字符串等等。

③在我们编写Java程序时,有很多参数是会经常改变的。比如环境的配置,我们开发的时候是⼀套环境,测试使用的可能⼜是另外⼀套环境,最后交付给用户的时候,用户用的又是另外⼀套环境,不能每次都重新编译,那样成本太高,所以对于这些参数往往不能直接写死在程序里,不然会非常麻烦,每次修改都需要重新运行⼀次程序,这时就需要借助配置⽂件来存储这些常变的参数,在程序中是读取配置⽂件中的变量的值,如果我们需要修改这些值,只需要修改配置⽂件即可。

1.3配置文件的使用规则

  1. XML格式化语法: 配置文件必须符合XML格式化语法,且符合XML规范。
  2. 格式规范: XML配置文件应该遵循一定的格式规范。
  3. 只读性: 配置文件一般是只读的,只能读取,不能被程序或系统删除或覆盖。
  4. 路径设置: 需要在程序或系统中指定配置文件所在的路径或文件名。
  5. 安全性: 配置文件中可能包含敏感的信息,如数据库密码,因此需要保证配置文件的安全性,比如加密或设置访问权限等。
  6. 版本控制: 配置文件通常需要进行版本控制,需要确保配置文件的版本与程序或系统版本匹配。

1.4配置文件的展示

展示如下

如上,db.properties就是一个配置文件,里面存放的就是所需要的一些变量。

2.Java中配置文件的三种配置位置及读取方式

2.1同包

即:配置文件与java文件放在同一层次(方便同步编写)

就像这样:

代码如下:

package kissship;
import java.io.InputStream;
import java.util.Properties;
/**
 * 读取各个文件的位置
 * 
 * @author jj
 *
 */
public class Demo1 {
  public static void main(String[] args) throws Exception {
    // 通过类加载器加载配置文件(同包下)
    InputStream in = Demo1.class.getResourceAsStream("db.properties");
    Properties p = new Properties();
    // 让Properties工具类对象,加载含有db.properties文件内容所对应的流
    p.load(in);
    System.out.println(p.getProperty("driver_Class"));
    System.out.println(p.getProperty("upass"));
  }
}

控制台输出结果:

将XML配置文件和Java文件放在同一层次中,对于大型项目或长期维护的项目来说是非常有益的。这样可以避免出现找不到配置文件的问题,可以方便统一部署和管理。访问和解析配置文件,提高开发效率。

2.2根路径

即:配置文件放在根目录下(一般不做频繁更改)

就像这样:

代码如下:

package kissship;
import java.io.InputStream;
import java.util.Properties;
/**
 * 读取各个文件的位置
 * 
 * @author jj
 *
 */
public class Demo1 {
  public static void main(String[] args) throws Exception {
    // 通过类加载器加载配置文件(同包下)
//    InputStream in = Demo1.class.getResourceAsStream("db.properties");
//    Properties p = new Properties();
    //通过类加载器加载配置文件(根路径下)
    InputStream in = Demo1.class.getResourceAsStream("/db.properties");
    Properties p = new Properties();
    // 让Properties工具类对象,加载含有db.properties文件内容所对应的流
    p.load(in);
    System.out.println(p.getProperty("driver_Class"));
    System.out.println(p.getProperty("upass"));
  }
}

控制台输出结果:

将配置文件放在根目录下可以方便地找到并进行管理修改和维护,而不必打开多个文件夹层级。同时也能让多个应用程序共享同一个配置文件。可以避免出现找不到配置文件的问题,方便程序员管理、修改和维护配置信息。

2.3WIN-INF安全路径

即:配置文件放在WEB-INF文件下(更加安全)

就像这样:

代码如下:

package kissship;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class WEBinfServlet
 */
@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 {
    //访问WEB-inf目录下的db.properties
    //拿到servlet上下文
    InputStream in = request.getServletContext().getResourceAsStream("/WEB-INF/db.properties");
    Properties p = new Properties();
    // 让Properties工具类对象,加载含有db.properties文件内容所对应的流
    p.load(in);
    System.out.println(p.getProperty("driver_Class"));
    System.out.println(p.getProperty("upass"));
  }
}

控制台输出结果:

将配置文件放在WEB-INF中,可以提高配置文件的安全性,有助于保护配置文件的安全。还可以避免其他应用程序或用户误操作配置文件的情况。

3.dom4j的使用

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>

代码展示(获取XML文件):

package kissship;
import java.io.InputStream;
import org.dom4j.Document;
import org.dom4j.io.SAXReader;
/**
 * 获取students中的内容   DOM4J解析
 * 1.selectNodes
 * 2.selectSingNode
 * 3.getText
 * 4.attributeValue
 * @author jj
 *
 */
public class Demo2 {
  public static void main(String[] args) throws Exception {
    //先获取到需要解析的配置文件
    InputStream in = Demo2.class.getResourceAsStream("students.xml");
    SAXReader sr = new SAXReader();
    Document doc = sr.read(in);
    System.out.println(doc.asXML());
  }
}

控制台结果:

3.1获取多个标签

方法名:selectNodes

3.2获取单个标签

方法名:selectSingleNode

3.3获取属性值

方法名:attributeValue

3.4获取标签值

方法名:getText

3.5方法展示

代码展示:

package kissship;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * 获取students中的内容   DOM4J解析
 * 1.selectNodes
 * 2.selectSingNode
 * 3.getText
 * 4.attributeValue
 * @author jj
 *
 */
public class Demo2 {
  public static void main(String[] args) throws Exception {
    //先获取到需要解析的配置文件
    InputStream in = Demo2.class.getResourceAsStream("students.xml");
    SAXReader sr = new SAXReader();
    Document doc = sr.read(in);
//    System.out.println(doc.asXML());
    //1.获取所有的student标签中的内容
    List<Element> stuEles = doc.selectNodes("/students/student");
    for (Element stuEle : stuEles) {
//      System.out.println(stuEle.asXML());
    //2.获取所有name标签的内容
    Element nameEle = (Element) stuEle.selectSingleNode("name");
//      System.out.println(nameEle.asXML());
    //3.获取标签内部内容
    System.out.println(nameEle.getText());
    //4.获取标签属性值,即学生的学号id
    System.out.println(stuEle.attributeValue("sid"));
    }
  }
}

4.xpath的使用

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 kissship;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * xpath解析
 * @author jj
 *
 */
public class Demo3 {
  public static void main(String[] args) throws Exception {
    //获取到sid=002学生的姓名
    InputStream in = Demo2.class.getResourceAsStream("students.xml");
    SAXReader sr = new SAXReader();
    Document doc = sr.read(in);
//    System.out.println(doc.asXML());
    //1.获取所有的student标签中的内容
    List<Element> stuEles = doc.selectNodes("/students/student");
    for (Element stuEle : stuEles) {
      if("s002".equals(stuEle.attributeValue("sid")));
      Element nameEle = (Element) stuEle.selectSingleNode("name");
      System.out.println(nameEle.getText());
    }
    //xpath解析
    Element nameEle = (Element) doc.selectSingleNode("/students/student[@sid='s002']/name");
    System.out.println(nameEle.getText());
  }
}

最后J2EE之XML解析(超详细)就到这里,祝大家在敲代码的路上一路通畅!

感谢大家的观看 !

目录
相关文章
|
1月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
1月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
1月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
79 0
|
1月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
66 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
52 0
|
1月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
59 0
|
1月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
78 0
|
1天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
9 2