XML语法指南——从入门到精通

1、引言

XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它被设计为具有自我描述性且易于理解。本文将全面介绍XML的语法规则,包括元素、属性、命名规则、转义字符等核心概念。

2、XML文档基本结构

一个完整的XML文档由以下几个部分组成:

  • XML声明(可选):定义XML版本和字符编码
  • 文档类型定义(DTD,可选):定义文档结构
  • 元素:文档的主要内容
  • 注释(可选):对文档进行说明
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这是一个XML示例文档 -->
<bookstore>
  <book category="fiction">
    <title lang="en">Harry Potter</title>
    <author>J.K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>

3、XML元素详解

3.1、 元素基本结构

XML元素是XML文档的基本构建块,由开始标签、内容和结束标签组成:

xml 复制代码
<元素名>内容</元素名>
  • 开始标签:<元素名>
  • 结束标签:</元素名>
  • 内容:可以是文本、其他元素或两者的组合
  • 没有内容的元素可以简写为:
xml 复制代码
<元素名/>

等价于:

xml 复制代码
<元素名></元素名>

3.2、元素嵌套

XML元素可以嵌套其他元素,但必须正确嵌套:

xml 复制代码
<parent>
  <child>
    <subchild>...</subchild>
  </child>
</parent>

不允许交叉嵌套:

xml 复制代码
<parent>
  <child>
</parent>
  </child>

3.3、元素命名规则

  • 名称可以包含字母、数字和其他字符 (、<book_title>、、<_book>,以上是正确的示例)
  • 名称不能以数字或标点符号开头(<1book>, 错误示例)
  • 名称不能以"xml"(或XML、Xml等)开头(, 错误示例)
  • 称不能包含空格(, 错误示例)
  • 名称区分大小写(XML的名称是区分大小写的,因此开始标签和结束标签的大小写要严格匹配才行)

4、XML属性详解

属性提供有关元素的额外信息,总是位于元素的开始标签中,语法如下:

xml 复制代码
<元素名 属性名="属性值">内容</元素名>

属性的规则如下:

  • 属性值必须用引号引起来(单引号或双引号)
  • 一个元素可以有多个属性
  • 属性不能重复
  • 属性不能包含嵌套结构
    属性示例如下:
xml 复制代码
<book category="fiction" lang="en">
  <title>Harry Potter</title>
</book>

那么问题来了,什么时候使用元素,什么时候使用属性呢?

  • 如果信息看起来像是数据的一部分,使用子元素
  • 如果信息看起来像是关于数据的元数据,使用属性

5、XML命名空间

命名空间用于避免元素名称冲突,特别是在合并多个XML文档时,命名空间语法如下:

xml 复制代码
<前缀:元素名 xmlns:前缀="命名空间URI">

命名空间示例如下:

xml 复制代码
<root xmlns:h="http://www.w3.org/TR/html4/"
      xmlns:f="http://www.w3schools.com/furniture">

<h:table>
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table>
  <f:name>Coffee Table</f:name>
  <f:width>80</f:width>
</f:table>

</root>

可以定义默认命名空间,这样就不需要为每个元素添加前缀:

xml 复制代码
<table xmlns="http://www.w3.org/TR/html4/">
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>

6、XML特殊字符处理

XML中有一些字符具有特殊含义,如果要在内容中使用这些字符,必须使用转义字符或CDATA节。

  • XML中预定义字符表
字符 实体引用
< &lt;
> &gt;
& &amp;
' '
" &quot;

示例如下:

xml 复制代码
<expression>a &lt; b</expression>
  • CDATA节
    对于包含大量特殊字符的文本,可以使用CDATA节:
xml 复制代码
<![CDATA[
  这里可以包含任意字符,包括 < > & ' "
  不会被XML解析器解析
]]>

示例如下:

xml 复制代码
<script>
<![CDATA[
  function compare(a, b) {
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
  }
]]>
</script>

7、XML注释

XML注释与HTML注释类似:

xml 复制代码
<!-- 这是一个注释 -->

注释规则如下:

  • 注释不能出现在XML声明之前
  • 注释不能出现在标签内部
  • 注释不能嵌套
  • 字符串"--"不能出现在注释中
    有效示例:
xml 复制代码
<?xml version="1.0"?>
<!-- 这是有效的注释 -->
<root>
  <!-- 另一个有效注释 -->
</root>

无效示例如下:

xml 复制代码
<!-- 第一个注释 <!-- 嵌套注释 --> -->
<root <!-- 标签内注释 --> >

8、XML中的DTD

XML文件中的DTD(Document Type Definition,文档类型定义) 正是用来定义该XML文件的结构和约束规则的。它规定了XML文档中允许出现哪些元素、元素的嵌套关系、属性以及它们的类型等。DTD可以确保XML文档符合预定义的结构,便于数据交换和验证。

8.1、DTD的作用

  • 定义元素结构:规定XML中可以包含哪些元素,以及元素的嵌套关系。
  • 定义属性:规定元素的属性及其类型(如文本、枚举、ID等)。
  • 定义实体:可以声明实体(类似于变量),用于复用文本或特殊字符。
  • 验证XML文档:确保XML文档符合DTD定义的规则,防止数据格式错误。

8.2、 内部DTD

DTD直接嵌入在XML文件中,适用于小型或独立的XML文档。

语法:

xml 复制代码
<!DOCTYPE 根元素名 [
  <!-- DTD规则定义 -->
]>

示例如下:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE bookstore [
  <!ELEMENT bookstore (book+)>  <!-- bookstore必须包含至少一个book -->
  <!ELEMENT book (title, author, year, price)>  <!-- book必须按顺序包含这些子元素 -->
  <!ELEMENT title (#PCDATA)>  <!-- title只能包含文本 -->
  <!ELEMENT author (#PCDATA)>
  <!ELEMENT year (#PCDATA)>
  <!ELEMENT price (#PCDATA)>
  <!ATTLIST book category CDATA #REQUIRED>  <!-- book必须有一个category属性 -->
]>
<bookstore>
  <book category="fiction">
    <title>Harry Potter</title>
    <author>J.K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>

8.3、 外部DTD

DTD存储在单独的文件中(如 bookstore.dtd),适用于大型项目或多文件共享相同结构。

语法:

xml 复制代码
<!DOCTYPE 根元素名 SYSTEM "DTD文件路径">

示例:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE bookstore SYSTEM "bookstore.dtd">
<bookstore>
  <book category="fiction">
    <title>Harry Potter</title>
    <author>J.K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>

bookstore.dtd 文件内容:

xml 复制代码
<!ELEMENT bookstore (book+)>
<!ELEMENT book (title, author, year, price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST book category CDATA #REQUIRED>

8.4 、DTD 常见语法规则

8.4.1、定义元素:

xml 复制代码
<!ELEMENT 元素名 (子元素|内容类型)>
  • (#PCDATA):表示纯文本(不能包含子元素)。
  • EMPTY:表示空元素(如 )。
  • ANY:表示可以包含任何内容(不推荐使用,会降低约束性)。
  • (A, B, C):表示必须按顺序包含A、B、C。
  • (A | B):表示只能包含A或B之一。
  • ?:表示可选(0或1次)。
  • *:表示0次或多次。
  • +:表示1次或多次

8.4.2、定义属性:

xml 复制代码
<!ATTLIST 元素名 属性名 属性类型 默认值>

属性类型如下:

  • CDATA:普通文本
  • ID:唯一标识符(不能重复)
  • IDREF:引用另一个元素的ID
  • (A|B|C):枚举值(只能是A、B或C)
  • NMTOKEN:合法的XML名称(不含空格)
    默认值:
  • #REQUIRED:必须提供该属性
  • #IMPLIED:可选属性
  • #FIXED "值":固定值(如果提供,必须匹配)
  • "默认值":如果未提供,则使用默认值
    示例:
xml 复制代码
<!ATTLIST book 
  id ID #REQUIRED
  category (fiction|non-fiction) "fiction"
  lang CDATA #IMPLIED
>

9、总结

XML(eXtensible Markup Language,可扩展标记语言)是一种用于存储和传输结构化数据的标记语言,它被设计为人类可读和机器可解,广泛应用于配置文件、文档存储(如Office Open XML)和数据交换(如RSS、SVG)等领域,掌握XML有助于帮助程序员理解"协议"的概念,如果在以后的工作中有用到XML,可以快速的上手开发。

相关推荐
十秒耿直拆包选手8 小时前
spring:xml方式调用构造方法创建Bean,调用set方法配置字段
xml·java·spring
2301_7944615710 小时前
XML、JSON 和 Protocol Buffers (protobuf) 对比
xml·json
weixin_448771721 天前
使用xml模板导出excel
xml·java·excel
东方芷兰1 天前
JavaWeb 课堂笔记 —— 08 请求响应
xml·java·笔记·spring·tomcat·html·idea
Eiceblue2 天前
使用Python写入JSON、XML和YAML数据到Excel文件
xml·开发语言·vscode·python·json·excel·pip
Allen Bright2 天前
【XML基础-1】深入理解XML:介绍、语法规则与实际应用
xml·前端
XiaoLeisj2 天前
【图书管理系统】深入解析基于 MyBatis 数据持久化操作:全栈开发图书管理系统:查询图书属性接口(注解实现)、修改图书属性接口(XML 实现)
xml·java·数据库·spring boot·sql·java-ee·mybatis
llkk星期五3 天前
Mujoco xml模型
xml·ubuntu·机器人
斗锋在干嘛4 天前
Android里面如何优化xml布局
android·xml