XML之XML解析

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: XML之XML解析

一、XML解析

1.1概念

XML 解析是将 XML 文件中的数据解析到程序中的过程。

XML 解析的过程是对 XML 文档结构逐步扫描和解析,然后读入内存。

XML 解析器读取文件时,按照 XML 文档的结构分解文件,解析并存储 XML 处理过程中所发现的元素、属性、文本和 CDATA 等数据。在完成解析后,程序可以通过解析器提供的 API 访问数据结构并对数据进行处理。

1.2 特点

1.2.1可读性强

XML 文件是基于文本的,易于阅读和理解,因此 XML 解析器可以读取文件内容并将其转化为易于处理的数据结构,方便后续的应用程序操作。

1.2.2 跨平台性好

由于 XML 语言的跨平台性,因此 XML 文件可以在不同的操作系统和应用程序之间进行数据传递。

1.2.3 灵活性高

在 XML 文件中,可以通过元素、属性、注释等多种方式定义数据和文档的结构,解析器可以根据定义的规则动态生成数据结构,适应各种应用场景。

1.2.4 可扩展性好

XML 语言具有很强的扩展性,可以扩展自定义元素和属性等,使得它能够适应不同的应用需求。

1.2.5 解析方式多样化

XML 解析器支持多种解析方式,包括 DOM、SAX、StAX 等。通过选择适当的解析器,可以根据具体情况选择最适合的解析方式,提高解析效率。

1.2.6 数据存储格式规范

通过定义 XML 文件的结构和数据类型等信息,可以确保数据在不同的应用程序和平台之间传递时保持规范的格式,避免了数据传输中数据格式的不兼容问题。

1.3体系

XML 解析体系通常包括四种解析方式,分别为:DOM 解析、SAX 解析、JDOM 解析和 DOM4J 解析。这些解析方式的区别在于解析 XML 文件的方式和结果的表现形式。

1.4配置文件不同配置位置下的读取方式

这里有一个properties文件

uname=mybatis_ssm
upass=xiaoli
url=jdbc:mysql://localhost:3306/mybatis_ssm
driver_Class=com.mysql.jdbc.Driver
initPoolSize=5
maxPoolSize=20

1.4.1同包

//    //获取资源
    InputStream io = Demo1.class.getResourceAsStream("db.properties");
    Properties p=new Properties();
    //读取后赋给p
    p.load(io);
    //打印
    System.out.println(p.getProperty("driver_Class"));//com.mysql.jdbc.Driver

1.4.2根路径

//    //获取资源
    InputStream io = Demo1.class.getResourceAsStream("/db.properties");
    Properties p=new Properties();
    //读取后赋给p
    p.load(io);
    //打印
    System.out.println(p.getProperty("driver_Class"));//com.mysql.jdbc.Driver

1.4.3web-inf 安全路径

package com.xqx.parse;
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;
/**
 * 读取安全路径下的文件
 */
@WebServlet("/webParse")
public class webParse 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 is = request.getServletContext().getResourceAsStream("/WEB-INF/db.properties");
    Properties p = new Properties();
    p.load(is);
    System.out.println(p.getProperty("driver_Class"));//com.mysql.jdbc.Driver
  }
}

二、DOM4J

2.1概念

DOM4J 是一种基于 Java 的高性能、高效、易扩展的 XML 解析器,它是基于 DOM 解析器的扩展。DOM4J 继承了 DOM 解析器的灵活性和易用性,同时还提供了更加丰富的 XPath 支持,并适用于对大型的、复杂的 XML 文件或需要频繁访问 XML 文件的部分内容的场景。

2.2特点

2.2.1性能高

DOM4J 在处理大型 XML 文件时具有很高的效率,比传统的 SAX 解析器更快。

2.2.2树形结构

DOM4J 采用了树形结构的方式来表示 XML 文档,程序可以通过遍历树形结构来处理 XML 数据。

2.2.3支持 XPath

XPath 是一种用于在 XML 文档中定位节点的语言,DOM4J 提供了强大的 XPath 支持,方便开发者定位和操作节点。

2.2.3易于扩展

DOM4J 具有很好的扩展性,开发者可以通过扩展 DOM4J API 来实现自定义的 XML 处理方法。

2.2.4支持文档类型定义(DTD)和 XML Schema

DOM4J 支持对 XML 文件进行验证,可以通过 DTD 或 XML Schema 等方式来验证 XML 文件的格式和正确性。

2.3常用方法

方法名称 方法描述
read() 使用 SAXReader 类的 read() 方法可以解析 XML 文件,返回代表整个文档的 Document 对象。
getRootElement() 使用 Document 对象的 getRootElement() 方法可以获取 XML 文档的根节点。
elements() 使用 Element 对象的 elements() 方法可以获取指定名称的子元素列表,并使用 Iterator 进行遍历元素。
element() 使用 Element 对象的 element() 方法可以获取指定名称的第一个子节点。
attributeValue() 使用 Element 对象的 attributeValue() 方法可以获取指定名称的属性值。
getText() 使用 Element 对象的 getText() 方法可以获取当前元素的子元素、内容和尾随文本组合在一起的字符串。
addElement() 和 addAttribute() 使用 DOM4J 提供的这些方法可以向某个元素中添加新的元素和属性。
setText() 和 setAttributeValue() 使用 Element 对象的这些方法可以修改元素和属性的值。
remove() 和 removeAttribute() 使用 Element 对象的这些方法可以删除元素和属性。
使用 XPath 表达式定位元素 使用 DOM4J 提供的 selectNodes() 和 selectSingleNode() 方法可以使用 XPath 表达式定位元素。

2.4使用

这里有一个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>

读取以上文件信息

InputStream is = Demo2.class.getResourceAsStream("students.xml");
    SAXReader sr = new SAXReader();
    Document document = sr.read(is);
    List<Element> list = document.selectNodes("students/student");
    for (Element element : list) {
      // System.out.println(element.asXML());
      Element name = (Element) element.selectSingleNode("name");
      System.out.println(name.asXML());
      System.out.println(element.attributeValue("sid"));
      System.out.println(name.getText());
    }

打印结果

<name>小明</name>
s001
小明
<name>小芳</name>
s002
小芳
<name>小王</name>
s003
小王

2.5XPath

XPath 是一种在 XML 中查找信息的语言,也是 DOM4J 中常用的定位元素的方法之一,它使用路径表达式来选取 XML 文档中的节点或节点集合。

2.5.1常用路径

路径表达式 描述
/ 选择根节点。
// 选择文档中的所有元素,而不考虑它们的位置。
. 选择当前节点。
选择父节点。
* 选择所有元素节点。
@ 选择属性。
node() 选择所有类型的节点,包括元素、属性、文本和注释节点等。
text() 选择文档中的所有文本节点。
//[@name] 选择所有包含名为name的属性的节点。
//[@name=‘value’] 选择所有名为name的属性为value的节点。
//element[@attribute=‘value’] 选择所有属性为value的element元素。
/element[position()] 获得第一个 element 元素节点。
/element[position()=last()] 获得最后一个 element 元素节点。
/element[position()>1] 获得第二个及以上的 element 元素节点。

2.5.2常用方法

方法名 描述
selectSingleNode(String xpath) 选择符合 xpath 表达式的第一个节点,返回 Node 对象。
selectNodes(String xpath) 选择符合 xpath 表达式的所有节点,返回 List 集合。
selectSingleNode(Element base, String xpath) 选择以 base 为根元素的文档中符合 xpath 表达式的第一个节点,返回 Node 对象。
selectNodes(Element base, String xpath) 选择以 base 为根元素的文档中符合 xpath 表达式的所有节点,返回 List 集合。
evaluate(String xpath, Object item, QName returnType) 在 item 中选择符合 xpath 表达式的节点,并将结果转换为 returnType 类型。常用的类型有 Node、String、Number、Boolean 等。
XPath.selectSingleNode(Object node, String xpath) 在 node 中选择符合 xpath 表达式的第一个节点,返回 Node 对象。node 可以是 Document、Element 等。
XPath.selectNodes(Object node, String xpath) 在 node 中选择符合 xpath 表达式的所有节点,返回 List 集合。node 可以是 Document、Element 等。

2.5.3使用

// //获取资源
    InputStream is = Demo2.class.getResourceAsStream("students.xml");
    SAXReader sr = new SAXReader();
    Document document = sr.read(is);
    List<Element> list = document.selectNodes("students/student");
    //拿到sid为s002的name
    System.out.println("===================dom4j解析方式=====================");
    for (Element element : list) {
      if ("s002".equals(element.attributeValue("sid"))) {
        Element name = (Element) element.selectSingleNode("name");
        System.out.println(name.getText());
      }
    }
    System.out.println("====================xpath解析方式============================");
    Element selectSingleNode = (Element) document.selectSingleNode("//student[@sid='s002']/name");
    System.out.println(selectSingleNode.getText());

打印结果:

===================dom4j解析方式=====================
小芳
====================xpath解析方式============================
小芳

三、DOM 解析

DOM(Document Object Model)解析器将整个 XML 文档读入内存,然后将其构造成一个完整的树形文档对象模型,可以通过节点、元素的方法来操作 XML 文档。这种方式适合读取和修改 XML 文档,并且支持对 XML 文档执行各种操作。缺点是不适合处理超大 XML 文件。

四、SAX 解析

SAX(Simple API for XML)解析器采用基于事件驱动的方式,逐行读取 XML 文档。当解析遇到一个节点时,就会发出事件,回调相应的方法来处理事件。这种方式适合处理超大 XML 文件,但只保存当前解析的节点,无法随意访问和修改 XML 数据。

五、JDOM 解析

JDOM(Java Document Object Model) 是一种基于 Java 的 XML 解析器,它提供了一种简单、易用且基于树形结构的 API,以便于对 XML 的操作。它可以将 XML 文件转换为一种更易于操作的形式,适合于频繁地读取和修改XML 文档。

好啦,今天的分享就到此为止!希望你看完本篇文章有所收获,祝你变得更强!!!

目录
相关文章
|
3月前
|
XML Java uml
spring 源码解析——第一篇(ioc xml方式)
spring 源码解析——第一篇(ioc xml方式)
23 0
|
23天前
|
XML 存储 IDE
Java_XML解析精讲
Java_XML解析精讲
14 0
|
1月前
|
XML 机器学习/深度学习 JSON
在火狐浏览器调ajax获取json数据时,控制台提示“XML 解析错误:格式不佳”。
在火狐浏览器调ajax获取json数据时,控制台提示“XML 解析错误:格式不佳”。
18 0
在火狐浏览器调ajax获取json数据时,控制台提示“XML 解析错误:格式不佳”。
|
2月前
|
XML Java 数据格式
Spring5源码(17)-Spring解析xml默认命名空间
Spring5源码(17)-Spring解析xml默认命名空间
18 0
|
2月前
|
XML JavaScript Java
Spring5源码(16)-Spring将Xml文件解析为Document对象
Spring5源码(16)-Spring将Xml文件解析为Document对象
30 0
|
2月前
|
XML 存储 安全
Unity 数据读取|(五)XML文件解析(XmlDocument,XmlTextReader)
Unity 数据读取|(五)XML文件解析(XmlDocument,XmlTextReader)
|
2月前
|
XML JavaScript Java
JAVA XML 解析
XML (eXtensible Markup Language) 意为可扩展标记语言,被多数技术人员用以选择作为数据传输的载体,成为一种通用的数据交换格式,xml的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的便利。在不同的语言中,解析xml的方式都是一样的,只不过实现的语法不同而已。众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J。
|
8天前
|
C语言
内核源码中遇到不会解析的宏怎么办?
内核源码中遇到不会解析的宏怎么办?
189 1
|
2月前
ChatGLM2 源码解析:`GLMTransformer`
ChatGLM2 源码解析:`GLMTransformer`
162 0
|
2月前
ChatGLM2 源码解析:`ChatGLMForConditionalGeneration.forward`
ChatGLM2 源码解析:`ChatGLMForConditionalGeneration.forward`
137 0

相关产品

  • 云迁移中心
  • 推荐镜像

    更多