xml-解析

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

一、为什么解析

在 Java 中解析 XML 文件的主要目的是从 XML 文档中提取数据,或者将数据转换为 XML 文档。由于 XML 是一种通用的数据表示格式,因此可以用于表示各种类型的数据,如配置文件、数据交换格式、文档等等。

通过解析 XML 文件,可以将其中的数据提取出来,存储到 Java 对象中,方便数据处理。例如,可以将一个 XML 格式的配置文件解析成一个 Java 对象,用于读取和设置程序的配置信息。还可以将 XML 表示的数据转换为其他格式,如 JSON、CSV 等等。

Java 中提供了多种 XML 解析库和技术,如 DOM、SAX、JAXB、StAX 等等,开发人员可以根据自己的需要选择合适的解析方式。不同的解析方式在处理大量的 XML 数据时,会有不同的性能表现和内存占用情况,开发人员需要根据自己的需求进行选择。

二、解析xml的作用

XML 文件通常用于存储和传输数据,因此在许多应用程序中需要解析 XML 文件以从其中提取数据或将数据转换为 XML 格式。

以下是解析 XML 文件的主要应用之一:

1. 提取数据

可以使用解析器从 XML 文件中提取数据,以便在应用程序中进行处理。例如,由于许多 Web 服务将其数据作为 XML 格式返回,因此可以使用 XML 解析器解析 Web 服务的响应并提取必要的数据。同样,在企业应用程序中,使用 XML 解析器可以从 XML 配置文件中提取必要的配置信息,如数据库连接信息和应用程序设置。

2. 数据转换

由于 XML 文件格式通用,因此可以使用 XML 解析器将不同格式的数据转换为 XML 格式或反之。例如,可以使用 XML 解析器将数据库查询的结果转换为 XML 格式,以便使用客户端应用程序进行处理。同样,在此过程中可以使用 XML 解析器将 XML 文件转换为其他格式,例如 JSON 或 CSV。

3. 数据校验

XML 文件通常包含有关数据结构和元素之间关系的信息,因此可以使用 XML 解析器对文件进行校验以确保其结构正确。例如,可以使用 XML Schema 定义 XML 文件的结构,然后使用 XML 解析器验证文件是否符合此结构。在许多应用程序中,这是确保数据完整性和一致性的重要步骤。

综上所述,解析 XML 文件是许多应用程序中的重要组成部分,并且可以使应用程序更加灵活和可扩展。

三、配置文件的路径及读取

Java 读取 XML 文件的方式与上述示例相同,只需要将文件路径设置为相对路径即可,在同包中可以使用相对路径 “file.xml”,在根目录中可以使用 “/” 开头的相对路径 “/file.xml”,在安全目录中需使用安全目录前缀 “filemanager:”,如 “filemanager:/root/file.xml”。

例如:我们要解析读取db_prop文件里的内容(根据文件里面的名称来获取内容)

以下是db_prop里的内容

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

1.同包

/**Demo01.class 类名点类
     * getResourceAsStream 方法
     */
    InputStream inputStream = Demo01.class.getResourceAsStream("db.prop");
    Properties pr = new Properties();
    try {
      pr.load(inputStream);
    } catch (IOException e) {
      e.printStackTrace();
    }
    System.out.println(pr.getProperty("uname"));
    System.out.println(pr.getProperty("upass"));
    System.out.println(pr.getProperty("url"));
    System.out.println(pr.getProperty("driver_Class"));

输入如下:        

2.根目录

InputStream inputStream = Demo01.class.getResourceAsStream("/db.prop");
        Properties pr = new Properties();
        try {
          pr.load(inputStream);
        } catch (IOException e) {
          e.printStackTrace();
        }
        System.out.println(pr.getProperty("uname"));
        System.out.println(pr.getProperty("upass"));
        System.out.println(pr.getProperty("url"));
        System.out.println(pr.getProperty("driver_Class"));

输入如下:      

3.安全路径(WEB-INF)

这个方法解析需要在Serlvet中进行,全部代码如下:

package com.SAME_LOVE.jx;
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("/inf")
public class inf extends HttpServlet {
  private static final long serialVersionUID = 1L;
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doPost(request, response);
  }
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // 3.安全目录下读取xml文件
    InputStream inputStream = request.getServletContext().getResourceAsStream("/WEB-INF/db.prop");
    Properties pr = new Properties();
    try {
      pr.load(inputStream);
    } catch (IOException e) {
      e.printStackTrace();
    }
    System.out.println(pr.getProperty("uname"));
    System.out.println(pr.getProperty("upass"));
    System.out.println(pr.getProperty("url"));
    System.out.println(pr.getProperty("driver_Class"));
  }
}

输出结果是:

四、dom4j的使用

如需求:要读取students.xml里的内容

     students.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<students>
  <student sid="s001">
    <name>反恐精英</name>
    <sex>男</sex>
  </student>
  <student sid="s002">
    <name>恐怖分子</name>
    <sex>男</sex>
  </student>
  <student sid='s003'>
    <name>独孤求败</name>
    <sex>人妖</sex>
  </student>
</students>

1.selectNodes

代码测试:

//需求读取students.xml文件的内容
    InputStream inputStream = Demo02.class.getResourceAsStream("students.xml");
    SAXReader sa = new SAXReader();
    Document read = null;
    try {//异常处理
       read = sa.read(inputStream);
    } catch (DocumentException e) {
      e.printStackTrace();
    }
    //System.out.println(read.asXML());
    //selectNodes方法读取
    List<Element> list = read.selectNodes("/students/student");
    for (Element e : list) {
      System.out.println(e.asXML());
    }

输出结果:

2.selectSingleNode

需求:只要students.xml文件中的student的name(根据以上代码的基础上修改)

//需求读取students.xml文件的内容
    InputStream inputStream = Demo02.class.getResourceAsStream("students.xml");
    SAXReader sa = new SAXReader();
    Document read = null;
    try {//异常处理
       read = sa.read(inputStream);
    } catch (DocumentException e) {
      e.printStackTrace();
    }
    //selectSingleNode方法读取
    List<Element> list = read.selectNodes("/students/student");
    for (Element e : list) {
      //括号参数是student的属性名称
      Element node = (Element) e.selectSingleNode("name");
      System.out.println(node.asXML());
    }

输出如下:

 

3.attributeValue

需求:要students.xml文件中的student的name里面的内容及该studen的sid属性值(根据以上代码的基础上修改)

//需求读取students.xml文件的内容
    InputStream inputStream = Demo02.class.getResourceAsStream("students.xml");
    SAXReader sa = new SAXReader();
    Document read = null;
    try {//异常处理
       read = sa.read(inputStream);
    } catch (DocumentException e) {
      e.printStackTrace();
    }
    //selectSingleNode方法读取
    List<Element> list = read.selectNodes("/students/student");
    for (Element e : list) {
      //括号参数是student的属性名称
      Element node = (Element) e.selectSingleNode("name");
      //attrbuteValue
      System.out.println(node.getText());
      //attrbuteValue获取属性值
      String value = e.attributeValue("sid");
      System.out.println(value);
    }

结果如下:

 

4.getText

需求:只要students.xml文件中的student的name里面的内容(根据以上代码的基础上修改)

//需求读取students.xml文件的内容
    InputStream inputStream = Demo02.class.getResourceAsStream("students.xml");
    SAXReader sa = new SAXReader();
    Document read = null;
    try {//异常处理
       read = sa.read(inputStream);
    } catch (DocumentException e) {
      e.printStackTrace();
    }
    //selectSingleNode方法读取
    List<Element> list = read.selectNodes("/students/student");
    for (Element e : list) {
      //括号参数是student的属性名称
      Element node = (Element) e.selectSingleNode("name");
      //attrbuteValue
      System.out.println(node.getText());
    }

结果如下:

五、xpath的使用

1.概述

XPath 是一门用于选择 XML 文档中节点的语言,在 XML 技术中扮演着重要的角色,常用于访问和处理 XML 数据,从而实现数据的分析、转换以及显示等操作。它是 W3C 组织定义的标准,为开发人员提供了一种统一的语法和方法来访问和操作 XML 数据。

XPath 的作用是选取 XML 数据中的一部分或多部分数据,其基本的选择方法和 SQL 相似。在 XPath 中,使用路径表达式来选取元素或者元素集合,可以通过属性、文本、位置和逻辑表达式等多种方式来精确地选取需要的节点。

XPath 支持的操作包括节点选择、属性选择、位置选择、逻辑运算、数学运算、字符串函数和节点集合处理等,同时还支持多种高级功能,如全文搜索、分组选取和结果排序等。

XPath 可以被多种系统和编程语言所支持,如 Java、JavaScript、Python、C# 等。XPath 相比其他处理 XML 数据的技术,如 DOM、SAX、StAX 等,更加灵活、简洁和开发效率更高,特别是处理大型 XML 数据的时候更具优势。

由于其方便性和普及性,XPath 成为了开发人员处理 XML 数据中必不可少的一种技术。

2.实例测试

需求:students.xml获取的student里面的某个属性

//需求读取students.xml文件的内容
    InputStream inputStream = Demo03.class.getResourceAsStream("students.xml");
    SAXReader sa = new SAXReader();
    Document read = null;
    try {//异常处理
       read = sa.read(inputStream);
    } catch (DocumentException e) {
      e.printStackTrace();
    }
    //selectSingleNode方法读取
    Element el = (Element) read.selectSingleNode("/students/student[@sid='s002']/name");
    System.out.println(el.getText());

输出结果为:恐怖分子

3.基本语法描述

以下是一些 XPath 的实例,以便更好地理解 XPath 的语法和用法:

1. 选取根节点

XPath 表达式 `/` 用于选取根节点。

例如,`/root` 表示选取 XML 文档中的根节点 `root`。

2. 选取所有节点

XPath 表达式 `//` 用于选取所有节点。

例如,`//book` 表示选取 XML 文档中所有的 `book` 节点。

3. 选取子节点

XPath 表达式 `/节点名` 用于选取子节点。

例如,`/catalog/book` 表示选取 XML 文档中 `catalog` 节点下的所有 `book` 节点。

4. 选取当前节点

XPath 表达式 `.` 用于选取当前节点。

例如,`./name` 表示选取当前节点下的 `name` 节点。

5. 选取父节点

XPath 表达式 `..` 用于选取父节点。

例如,`../name` 表示选取父节点下的 `name` 节点。

6. 选取元素值

XPath 表达式 `/节点名/text()` 用于选取元素值。

例如,`/bookstore/book/title/text()` 表示选取 XML 文档中 `bookstore` 节点下的所有 `book` 节点的 `title` 元素值。

7. 选取属性值

XPath 表达式 `/节点名/@属性名` 用于选取属性值。

例如,`/bookstore/book/@category` 表示选取 XML 文档中 `bookstore` 节点下的所有 `book` 节点的 `category` 属性值。

8. 选取满足条件的节点

XPath 表达式 `//节点名[过滤条件]` 用于选取满足过滤条件的节点。

例如,`//book[price>35]` 表示选取 XML 文档中 `book` 节点中 `price` 属性值大于 35 的节点。

9. 使用函数

XPath 中包含了丰富的函数来处理 XML 文档。例如,`starts-with()` 函数用于测试节点是否以指定的字符串开头。

例如,`/bookstore/book[starts-with(title,'A')]` 表示选取 XML 文档中 `bookstore` 节点下的所有 `book` 节点的 `title` 元素值以字母 A 开头的节点。

综上所述,XPath 提供了丰富的语法和函数来处理 XML 文档,方便开发者高效地访问和处理 XML 数据。开发者可以根据需要使用不同的语法和函数来选择所需的节点和数据。

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

推荐镜像

更多