【XML】探讨XML语法、解析与XPath应用

一、前言

在编程中,XML (可扩展标记语言)是一种常用于存储和交换数据的标记语言,它具有良好的人机可读性和通用性。在本文中,我们将探讨XML的各个方面,包括XML的介绍与用途语法规则语义约束Java中的XML解析 以及XPath路径表达式

二、内容

2.1 XML介绍与用途

什么是 XML

XML的全称是EXtensible Markup Language,可扩展标记语言。与HTML类似,XML也是通过标签来描述数据的格式和结构,但XML更加通用,不仅用于网页,还用于数据的存储和交换。

XML示例:

xml 复制代码
<!-- hr.xml -->
<employee>
  <name>王五</name>
  <age>18</age>
  <height>170</height>
</employee>

XML vs HTML

XMLHTML 都使用标签来描述文档结构,但它们有一些关键区别:

xml 复制代码
<school>
<class no="G3N1"> 
    <grade>大二</grade>
    <name>5班</name>
</class>
<class no="G3N2">
    <grade>大二</grade>
    <name>6班</name>
</class>
</school> 
html 复制代码
<body>
 <a href="index.html">首页</a>
</body>

主要区别:

  • XML是通用的数据描述语言 ,而HTML用于呈现文档
  • XML强调数据的结构和内容 ,而HTML强调文档的呈现和布局

2.2 XML的语法规则

XML 文档结构

XML文档必须遵循一定的结构规则:

  • 第一行必须是XML声明,包含版本号和字符集信息。
  • XML文档有且只有一个根节点。
  • XML标签的书写规则与HTML相同。

XML 声明

XML 声明说明 XML文档 的基本信息,包括版本号与字符集,写在 XML第一行。

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>

其中:

  • version 代表版本号,可以是 1.0 或 1.1
  • encoding UTF-8 设置字符集,用于支持中文

合法的标签名

XML 标签名必须遵循一些规则:

xml 复制代码
<abc>abc</abc> <!-- 合法,但不推荐,无意义 -->
<考试$>数学期末</考试$> <!-- 不合法,不能包含特殊字符$ -->
<class><class>班级</class></class> <!-- 不合法,标签名重复 -->
<shop-cart><item>照片</item></shop-cart> <!-- 合法 -->

适当的注释与缩进

为了提高XML文档的可读性,建议使用注释和缩进:

xml 复制代码
<!-- 这是一个示例XML文档 -->
<employee>
  <name>王五</name>
  <age>18</age>
  <height>180</height>
</employee>

合理使用属性

XML标签可以包含属性,用于提供额外的信息:

xml 复制代码
<book title="Harry Potter" author="J.K. Rowling">
  <chapter>Chapter 1</chapter>
</book>

处理特殊字符

在标签体中出现 "<"">" 等特殊字符可能会破坏文档结构,需要特殊处理:

解决方案:

  1. 使用实体引用。

    可以使用实体引用来代替特殊字符:

    实体引用 对应符号 说明
    &lt; < 小于
    &gt; > 大于
    &amp; & 和号
    ' ' 单引号
    &quot; " 双引号
  2. 使用CDATA标签。

    CDATA标签用于包含不应由XML解析器解析的文本数据:

    比如:

    xml 复制代码
    <description><![CDATA[This is a <b>bold</b> text.]]></description>

有序的子元素

在多层嵌套的子元素中,标签的前后顺序应保持一致,以维护数据的结构完整性。


2.3 XML语义约束

XML文档结构正确,但可能不是有效的。XML语义约束用于规定XML文档中允许出现哪些元素。

例如,员工档案 XML 中绝不允许出现"植物品种" 标签。XML语义约束就是用于规定 XML 文档中允许出现哪些元素。

XML语义约束有两种定义方式:DTDXML Schema

Document Type Definition

DTDDocument Type Definition,文档类型定义)是一种简单的语义约束方式,用于规定XML文档的结构。

DTD 文件的扩展名为 .dtd

比如:

dtd 复制代码
<!ELEMENT hr (employee+)>
<!ELEMENT employee (name,age,salary,department)>
<!ATTLIST employee no CDATA "">
<!ELEMENT name (#PCDATA)>
...
DTD 定义节点

利用 DTD 中的标签,我们可以定义 XML 文档中允许出现的节点及其数量。

比如:

  • 定义 hr 节点下只允许出现 1employee 子节点:
dtd 复制代码
<!ELEMENT hr (employee)>
  • employee 节点下必须包含 nameagesalarydepartment节点,并按顺序出现:
dtd 复制代码
<!ELEMENT employee (name,age,salary,department)>
  • 定义 name 标签体只能是文本,#PCDATA 代表文本元素:
dtd 复制代码
<!ELEMENT name (#PCDATA)>

DTD 定义节点数量

如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符:

  • hr 节点下最少出现 1 个 employee 子节点。
dtd 复制代码
<!ELEMENT hr (employee+)>
  • hr 节点下可出现 0...nemployee子节点。
dtd 复制代码
<!ELEMENT hr (employee*)>
  • hr 节点下最多出现 1 employee 子节点。
dtd 复制代码
<!ELEMENT hr (employee?)>

XML 引用 DTD 文件

XML 中使用 <!DOCTYPE> 标签来引用 DTD 文件。

书写格式如下:

xml 复制代码
<!DOCTYPE 根节点 SYSTEM "dtd文件路径">

举个例子:

xml 复制代码
<!DOCTYPE hr SYSTEM "hr.dtd">

XML Schema

XML Schema(XML模式)是一种用于定义XML文档结构和数据类型的替代DTD的方案。与DTD相比,XML Schema提供了更强大和灵活的工具来描述XML文档的结构和语义。

XML Schema支持丰富的数据类型,如字符串、整数、日期、布尔值等。允许我们定义更复杂的数据约束,如最小值、最大值、正则表达式模式等。同时, XML Schema文档本身是一个XML文档,因此具有更好的自描述性,提供了更强大的命名空间支持,并允许我们定义元素和属性的子元素、顺序、出现次数等规则,从而更精确地描述文档结构。

举个例子:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
  <element name="hr">
    <!-- complexType标签含义是复杂节点,包含子节点时必须使用这个标签 -->
    <complexType>
      <sequence>
        <element name="employee" minOccurs="1" maxOccurs="9999">
          <complexType>
            <sequence>
              <element name="name" type="string"></element>
              <element name="age">
                <simpleType>
                  <restriction base="integer">
                    <minInclusive value="18"></minInclusive>
                    <maxInclusive value="60"></maxInclusive>
                  </restriction>
                </simpleType>
              </element>
              <element name="salary" type="integer"></element>
              <element name="department">
                <complexType>
                  <sequence>
                    <element name="dname" type="string"></element>
                    <element name="address" type="string"></element>
                  </sequence>
                </complexType>
              </element>
            </sequence>
            <attribute name="no" type="string" use="required"></attribute>
          </complexType>
        </element>
      </sequence>
    </complexType>
  </element>
</schema>

这个XML Schema为XML文档定义了严格的结构和数据类型规则,确保XML文档符合人力资源管理系统的要求。XML文档必须遵循这些规则,否则将被视为无效。


2.4 Java 解析 XML

DOM 文档对象模型

DOM是一种用于解析XML的模型,将XML文档视为树形结构,可以方便地遍历和修改XML文档。

Dom4j

Dom4j是一个开源的Java库,用于解析和操作XML文档。它易于使用,性能优异,并提供了丰富的功能。

  • Dom4j 将 XML 视为 Document 对象。
  • XML 标签被 Dom4j 定义为 Element 对象。

利用 Dom4j 遍历 XML

java 复制代码
// 导入Dom4j相关类
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

public class XMLParser {
  public static void main(String[] args) {
    try {
      // 创建SAXReader对象
      SAXReader reader = new SAXReader();
      // 读取XML文件
      Document document = reader.read("hr.xml");
      // 获取根节点
      Element root = document.getRootElement();
      
      // 遍历子元素
      for (Element employee : root.elements("employee")) {
        String name = employee.elementText("name");
        String age = employee.elementText("age");
        System.out.println("Name: " + name + ", Age: " + age);
      }
    } catch (DocumentException e) {
      e.printStackTrace();
    }
  }
}

利用 Dom4j 更新 XML

java 复制代码
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class XMLUpdater {
  public static void main(String[] args) {
    try {
      // 创建空的XML文档
      Document document = DocumentHelper.createDocument();
      // 创建根节点
      Element root = document.addElement("employees");
      
      // 创建子节点
      Element employee = root.addElement("employee");
      employee.addElement("name").setText("李四");
      employee.addElement("age").setText("25");
      
      // 将XML写入文件
      XMLWriter writer = new XMLWriter(new FileWriter("new_hr.xml"));
      writer.write(document);
      writer.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

2.5 XPath 路径表达式

XPath 路径表达式

XPath是一种用于在XML文档中查找数据的语言,它允许通过路径表达式定位XML文档中的元素。

  • 掌握 XPath 可以极大的提高在提取数据时的开发效率。
  • 学习 XPath 本质就是掌握各种形式表达式的使用技巧。

XPath 基本表达式

最常用的基本表达式:

  • /:从根节点开始选取
  • //:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
  • element:选取指定名称的元素
  • @attribute:选取指定名称的属性
  • text():选取元素的文本内容

XPath 基本表达式案例

比如:

xml 复制代码
<books>
  <book>
    <title>XML Basics</title>
    <author>John Doe</author>
  </book>
  <book>
    <title>Java Programming</title>
    <author>Jane Smith</author>
  </book>
</books>

示例XPath表达式:

  • /books:选取根元素books
  • /books/book:选取根元素下的book元素
  • //author:选取所有author元素
  • /books/book[1]:选取第一个book元素
  • /books/book/title/text():选取第一个book元素的 title 文本内容

XPath 谓语表达式

谓语表达式用于过滤元素,可以根据条件来选择元素:

比如:

  • /books/book[author='John Doe']:选取作者为'John Doe'的book元素
  • /books/book[price>20]:选取价格大于20的book元素

三、总结

本文介绍了XML的各个方面,包括XML的基本介绍与用途、语法规则、语义约束、Java中的XML解析以及XPath路径表达式。总的来说,XML是一种强大的数据交换格式,掌握它将有助于处理和管理各种数据源。

相关推荐
drebander2 分钟前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
乌啼霜满天2496 分钟前
Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
java·spring boot·spring·mvc
tangliang_cn11 分钟前
java入门 自定义springboot starter
java·开发语言·spring boot
程序猿阿伟12 分钟前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
Grey_fantasy22 分钟前
高级编程之结构化代码
java·spring boot·spring cloud
弗锐土豆28 分钟前
工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程
java·opencv·安全·检测·面部
Elaine20239129 分钟前
零碎04 MybatisPlus自定义模版生成代码
java·spring·mybatis
小小大侠客1 小时前
IText创建加盖公章的pdf文件并生成压缩文件
java·pdf·itext
一二小选手1 小时前
【MyBatis】全局配置文件—mybatis.xml 创建xml模板
xml·java·mybatis
码老白1 小时前
【老白学 Java】Warshipv2.0(二)
java·网络