深入浅出XML:从基础到约束

一、什么是XML

XML(Extensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的通用文本格式。它的标签没有预定义,用户可根据需求自定义,实现对数据层级关系的清晰描述。

主要用途

  1. 存储数据:例如省市区三级结构;

    • 在Java生态中,常用作框架配置文件:

      • Spring:applicationContext.xml

      • MyBatis:mybatis-config.xml

      • Log4j2:log4j2.xml

  2. 数据传输:服务端与客户端交换数据,JSON是目前最主流的传输格式。

当前XML标准版本:1.0

二、XML文档的基本组成

1. 文档声明(可选)

<?xml version="1.0" encoding="UTF-8"?>
  • 必须放在文件首行;

  • 属性说明:

    • version:XML版本,当前为1.0;

    • encoding:字符编码,一般使用UTF-8;

2. 元素(Element)

  • 又称标签,每个XML文件必须有唯一的根元素

  • 由开始标签、内容、结束标签组成,支持嵌套,但必须遵循层级关系;

  • 命名规范

    1. 不能以数字开头;

    2. 不能使用"XML"(不区分大小写);

    3. 不能包含空格或冒号;

    4. 区分大小写;

<users>
  <user>
      <id>10001</id>
      <name>sangui</name>
      <password>333</password>
  </user>
  <user>
      <id>10002</id>
      <name>Jack</name>
      <password>abc</password>
  </user>
</users>

3. 属性(Attribute)

  • 定义在开始标签内;

  • 格式:属性名="属性值"

  • 同一元素不能有重复属性名;

  • 属性命名同样遵守元素命名规范;

<user id="10001" country="China" source="Android">
  <!-- ... -->
</user>

4. 注释(Comment)

  • 格式:

    <!-- 这里是注释 -->
  • IDEA快捷键:Ctrl + Shift + /(Windows)

5. 转义字符(Entity)

  • 用于表示特殊字符:

    • &gt;&

    • &lt;<

<salary>salary &gt; 1000 &amp; salary &lt; 3000</salary>

6. 字符区(CDATA)

  • 将复杂文本(如含<&等)包裹在CDATA中,防止解析错误;

  • 格式:

    <![CDATA[
    salary > 1000 & salary < 3000
    ]]>

提示:在MyBatis的Mapper XML中书写SQL语句时,可用CDATA来处理特殊符号。

7. 完整示例

<?xml version="1.0" encoding="UTF-8"?>
<!-- 根元素:users -->
<users>
  <user id="10001" country="China" source="Android">
      <id>10001</id>
      <name>sangui</name>
      <password>333</password>
      <salary>salary &gt; 1000 &amp; salary &lt; 3000</salary>
  </user>
  <user id="10002" country="US" source="iOS">
      <id>10002</id>
      <name>Jack</name>
      <password>abc</password>
      <salary>
          <![CDATA[
          salary > 1000 & salary < 3000
          ]]>
      </salary>
  </user>
</users>

三、XML约束(Validation)

XML本身不强制标签与属性规范化,需要借助约束来定义文档结构和数据类型。主要有两种约束方式:

  • DTD(Document Type Definition,文件后缀.dtd

  • XSD(XML Schema Definition,文件后缀.xsd

1. DTD 约束

  • 定义元素层级、属性类型及约束;

  • 简单易用,但类型限制较弱;

示例 DTD 定义

<!ELEMENT users (user+)>
<!ELEMENT user (id,name,password)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ATTLIST user
  id ID #REQUIRED
  country CDATA #IMPLIED
  platform CDATA #FIXED "ittimeline"
  source (Android|iOS|PC|WeChat) "Android"
>

DTD 引用方式

<!-- 外部本地 -->
<!DOCTYPE users SYSTEM "user.dtd">

<!-- 外部公共 -->
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!-- 内部 DTD -->
<!DOCTYPE users [
  <!-- 在此定义 DTD -->
]>

2. XSD 约束

  • 基于XML的Schema语言,可定义复杂类型、数据类型、更灵活的出现次数;

  • 广泛应用于Spring、WebService等场景。

示例 XSD 定义

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
          targetNamespace="https://www.sangui.top"
          elementFormDefault="qualified">
<xs:element name="orders">
  <xs:complexType>
    <xs:sequence maxOccurs="3" minOccurs="1">
      <xs:element name="order">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="id" type="xs:unsignedInt"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="bookTime" type="xs:dateTime"/>
            <xs:element name="amount" type="xs:double"/>
          </xs:sequence>
          <xs:attribute name="orderId" type="xs:string" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

XSD 引用方式

<orders xmlns="https://www.sangui.top"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="https://www.sangui.top order.xsd">
<!-- ... -->
</orders>
  • 微信
  • 赶快加我聊天吧
  • QQ
  • 赶快加我聊天吧
  • weinxin
三桂

发表评论 取消回复 您未登录,登录后才能评论,前往登录