一、前言
1.什么是XML解析
XML解析是指将XML格式数据转换成计算机程序能够理解的数据结构的过程。XML解析器可以将XML文件解析成DOM(文档对象模型)、SAX(简单API for XML)等不同的数据结构。通过对XML文件进行解析,程序可以读取和操作其中的数据,从而实现对XML文件的数据分析和处理。常用的XML解析库包括Java中的DOM解析器和SAX解析器,C++中的libxml2库和TinyXML库,Python中的ElementTree库和lxml库等。
2.为什么要学习XML解析
1.处理XML数据:XML是广泛使用的数据存储格式,因此学习XML解析可以帮助我们读取并处理这些数据。
2.跨平台支持:由于XML可以在不同的操作系统和编程语言之间进行交换,因此学习XML解析可以使你的代码更具可移植性和互操作性。
3.对XML数据进行操作:解析XML可以使你从XML数据中获取到所需的信息,进而对其进行操作。
4.手动读取XML文件:学会XML解析之后,你可以手动读取XML文件而无需使用特殊的软件,更方便。
5.了解相关解析技术:XML解析是一种思考问题和设计算法的能力,学习后可了解相关技术,提高编程能力。
3.怎么学习XML解析
2.掌握各种 XML 解析器的 API,如 DOM、SAX、StAX、JDOM、Dom4j 等;
3.了解 XPath 表达式的语法和使用方法;
4.应用 XML 解析器和 XPath 表达式来提取 XML 文档中的信息,了解处理 XML 数据的常用技巧;
5.实践中遇到的一些常见问题和解决方法。
二、XML解析器使用
1.获取Java中配置文件的路径
在项目中xml位置可能存在于同包、不同包、安全路径(WEB-INF)下,那我们应该用怎样的方式获取配置文件以及读取
同包的情况
InputStream is = Test01.class.getResourceAsStream("db.properties"); Properties p = new Properties(); p.load(is); System.out.println(p.getProperty("url"));
代码解析:首先使用 getResourceAsStream() 方法读取了同包下名为 db.properties 的文件, 然后通过Properties 类的 load() 方法加载了读取到的数据。 最后,通过 getProperty() 方法获取指定键(即属性名)对应的值。
不同包的情况(.properties)
InputStream iss = Test01.class.getResourceAsStream("/config.properties"); //不同包只需添加“/”即可 Properties pp = new Properties(); pp.load(iss); System.out.println(pp.getProperty("url"));
注意:这里的配置文件后缀都是.properties。所以要用到Properties 类,而Properties 类是 Java 提供的一个处理配置文件的工具类, 专门用于读取以键值对形式存储的配置文件。 这个工具类继承自 Hashtable类,因此在处理配置文件时,可以使用键值对进行存储和读取。
不同包的情况(.xml)
InputStream is = Test01.class.getResourceAsStream("/students.xml"); SAXReader sr=new SAXReader(); Document read = sr.read(is); System.out.println(read.asXML());
这里用到的就不是Properties 类了,而是SAXReader,详细了解移至2.Dom4j 框架SAXReader的使用查看。
安全路径(WEB-INF)情况
package XW.J2EE.XML02; 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; /** * 获取web-inf下的文件 */ @WebServlet("/Test02") public class Test02 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 iss = request.getServletContext().getResourceAsStream("/WEB-INF/db.properties"); Properties pp = new Properties(); pp.load(iss); System.out.println(pp.getProperty("url")); } }
代码解析:通过使用 Servlet API 提供的
ServletContext
对象来读取WEB-INF 目录下的配置文件。ServletContext
对象是在应用程序启动时创建的,用于存储 Web应用程序的上下文信息。
2.Dom4j 框架SAXReader的使用
2.1.Dom4j框架
Dom4j 是一个开源的 XML 解析框架,它基于 Java 的 sax 解析器和 jaxp 解析器开发,提供了灵活简便、性能优良、扩展性强的 XML 解析和生成功能。
2.2.SAXReader的使用
SAXReader的常用方法
方法 | 方法描述 |
asXML() | 获取将当前节点及其所有子节点转换为 XML 字符串,并返回该字符串 |
read() | 用于从输入源中读取 XML 文档,并将其生成一个 org.dom4j.Document 对象,表示完整的 XML 文档 |
selectNodes() | 获取符合条件的节点列表,该方法会返回list集合 |
selectSingleNode() | 获取符合条件的节点。该方法会返回一个 Element 对象 |
getText() | 获取节点内容 |
attributeValue() | 获取节点属性值 |
案例:获取config包下student.xml
InputStream is = Test01.class.getResourceAsStream("/students.xml"); SAXReader sr=new SAXReader(); Document read = sr.read(is); //获取符合条件的节点列表,该方法会返回list集合 List<Element> selectNodes = read.selectNodes("/students/student"); for (Element element : selectNodes) { System.out.println("selectNodes:"+element.asXML()); //获取符合条件的第一个节点。该方法会返回一个 Element 对象 Element strele = (Element) element.selectSingleNode("name"); //获取节点内容 System.out.println("selectSingleNode:"+strele.getText()); //获取节点属性 System.out.println("attributeValue:"+element.attributeValue("sid")); }
注意:selectSingleNode方法返回的最好是Element对象,需要强转,如果是Node对象,有些功能可能没有。因为Element对象是Node对象的子类,由于Java多态的特点,子类更为强大。
3.xpath的使用
3.1.什么是xpath
XPath (XML Path Language) 是一种用于在 XML 文档中定位节点的语言,它提供了一种简单而强大的方式来查询、选择、遍历和修改 XML 文档中的节点元素。
3.2.语法
/ :定位路径
@ :属性
例如,我们还是拿到config包下student.xml的节点student属性为s002的学员姓名
平常的思路
InputStream is = Test01.class.getResourceAsStream("/students.xml"); SAXReader sr=new SAXReader(); Document read = sr.read(is); //System.out.println(read.asXML()); //获取符合条件的节点列表,该方法会返回list集合 List<Element> selectNodes = read.selectNodes("/students/student"); for (Element element : selectNodes) { //获取sid为‘s002’的姓名 if("s002".equals(element.attributeValue("sid"))) { Element strele = (Element) element.selectSingleNode("name"); //获取节点内容 System.out.println(strele.getText()); } }
xpath的思路
//xpath的使用定位路径用“/”,属性用“@” Element xpath = (Element) read.selectSingleNode("/students/student[@sid='s002']/name"); String text = xpath.getText(); System.out.println("xpath:"+text);
结果是一样的,但是xpath更为简洁。
关于Dom4j框架解析XML就分享到这里啦!!