目录
一,什么是XML解析
1.1 概述:
将XML文档转换为计算机程序可读取的格式的过程。XML文档中的元素、属性、实体等都需要被解析成程序能够理解的形式,以便程序能够对其进行处理和操作。
1.2 解析方式(四种)
1.2.1 DOM解析:
DOM(文档对象模型)解析器将整个XML文档读入内存,并创建一个文档树,程序可以遍历该文档树并操作其中的节点。DOM解析器适用于文档相对较小的情况。
1.2.2 SAX解析:
一个事件驱动的解析器。按顺序读取XML文档,并触发事件,例如元素开始和结束、注释、处理指令等等。SAX解析器适用于大型XML文档,因为它不要求将整个文档加载到内存中。
1.2.3:StAX解析:
是SAX和DOM两种解析器的结合体。StAX解析器使用迭代器的方式依次处理XML文档中的元素、属性、实体等,并且可以在处理中插入自定义的代码,以便在解析过程中进行特定的业务逻辑操作。
1.2.4:JAXB解析:
将XML与Java对象之间进行双向转换。它通过将XML文档中的元素、属性等映射到Java类的属性和方法上,从而将XML文档转换为Java对象,并且可以将Java对象转换为XML文档。JAXB解析器适用于需要将XML文档和Java对象之间进行频繁转换的应用程序。
二,配置文件的解析(同包,根路径,WEB-INF安全路径)
2.1 同包路径解析配置文件
概念:什么叫同包下路径的配置文件呢?(看下图),配置文件和解析配置文件的类在同一个包中,就叫同包,config这个包就是另外的包
2.1 普通配置文件同包解析过程:
一:获取需要解析配置文件
二:定义解析的类 properties
三:将解析加载配置文件(相当于解析了配置文件)
四:输出解析打印想要获取的文件内容
所需要配置文件db.properties:
解析文件代码:
package com.LiuBing_text;
/**
* 读取不同下的配置文件
*/
import java.io.InputStream;
import java.util.Properties;
public class Demo1 {
public static void main(String[] args) throws Exception {
// 同目录下的配置文件 获取配置文件
InputStream in = Demo1.class.getResourceAsStream("db.properties");
// Properties 加载附有db.properties文件的内容
Properties p = new Properties();
p.load(in);
// 打印输出
System.out.println(p.getProperty("uname"));
System.out.println(p.getProperty("upass"));
}
}
运行结果:
2.2 根目录中解析文件
2.2.1理念:
步骤大致都是一样的,只需要在获取配置文件的在前打一个' / ' 代表着源根文 件目录
注意:要看配置文件是否Floder文件包中,因为它属于普通文件夹Java源文件无法编译成 Java字节码,文件只会当作普通文件夹和资源文件夹,一定在SourceFolder源文 件夹)下
2.3 WEB-INF安全目录解析文件
前提:如果需要获取定义在安全目录下的文件,需要定义Servlet去获取配置文件
注意:注意配置文件的位置,一定是要在WEB-INF安全目录下(如下图), 第一个 db.properties是在WEB-INF安全文件下。最下面一个db.properties是没在安全目 录下是无法解析配置文件的
如果确定没有问题就开始定义一个Servlet类,普通的类是无法解析的,内容不可通过URL直接访问,它们只能被Web应用程序访问。
Servlet解析代码:
package com.LiuBing_text;
/**
* 安全目录下获取文件
*/
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.FilterRegistration;
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 Db_properties_Servlet
*/
@WebServlet("/ccc")
public class Db_properties_Servlet 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 加载附有db.properties文件的内容
Properties p= new Properties();
p.load(in);
System.out.println(p.getProperty("uname"));
System.out.println(p.getProperty("upass"));
}
}
在Servlet中要先获取上下文信息,再读取配置文件,大致操作步骤内容都和同包和根源文件操作是一致的
三,XML配置文件的解析
3.1方法:
- selectNodes(); 获取某一个节点
- selectSingNode(); 获取单个节点
- getText(); 获取某一个标签的内容
- attributeValue(); 获取属性的值
代码展示:
package com.LiuBing_text;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class Demo2 {
// selectNodes 获取某一个节点
// selectSingNode 获取单个节点
// getText 获取某一个标签的内容
// attributeValue//获取属性的值
public static void main(String[] args) throws Exception {
// 获取需要解析的xml配置文件
InputStream in = Demo1.class.getResourceAsStream("students.xml");
// 定义一个xml解析器 以便读取所有的节点
SAXReader sr = new SAXReader();
// 读取xml文件 Document对象代表了整个XML文档,它是所有元素的根元素。
Document doc = sr.read(in);
// asXML();XML元素转换为XML文本形式
// 获取所有的xml文件的内容
System.out.println(doc.asXML());
//获取student节点
List<Element> student = doc.selectNodes("/students/student");
//遍历拿到父标签下所有的父标签和子标签及属性
for (Element studenElement : student) {
// 获取student下的所有标签内容
// System.out.println(studenElement.asXML());
// 只获取name标签及以下内容
// Element nameElement = (Element) studenElement.selectSingleNode("name");
// System.out.println(nameElement.asXML());
// 获取name中的内容
// System.out.println(nameElement.getText());
// 获取student标签中的id
// System.out.println(studenElement.attributeValue("sid"));
}
// Xpath
Element studenElement1 = (Element) doc.selectSingleNode("/students/student[@sid='s003']/name");
System.out.println(studenElement1.getText());
}
}