XML(eXtensible Markup Language)
eXtensible Markup Language(可扩展标记语言)是一种用来存储和传输数据的文本格式。
具体定义
- XML 可扩展标记语言,是用于标记电子文件使其具有结构性的标记语言,可以
用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的
源语言。 - XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素。与
HTML 不同,XML 不使用预定义标签,因此可以为标签指定描述数据的名称。 - 在 Web 历史的早期,XML 作为一种数据传输格式非常流行(“AJAX”中的“X”
即代表“XML”),但它的受欢迎程度现在已经下降,转而支持 JSON 格式。
XML vs HTML
特性 | XML | HTML |
---|---|---|
主要用途 | 用于传输与存储数据 | 用于显示数据 |
格式要求 | 严格区分大小写 | 不区分大小写 |
空格处理 | 不会自动删除空格 | 自动删除空格 |
标签定义 | 标签可根据数据需求自定义扩展 | 标签是预定义的 |
XML文档的构建模块
元素元素 (Element):
XML 文档的基本组成单位。一个元素由开始标签、结束标签及其内容组成。元素可以包含属性、文本、其他元素或这些的组合。元素的名称通常遵循大小写敏感的规则。
示例:
<book>内容</book>
属性 (Attribute):
属性用于为元素提供额外的描述信息。属性总是包含在开始标签中,具有键值对的形式。
示例:
<book title="学习XML">内容</book>
在这个例子中,title 是 book 元素的属性,值为 “学习XML”。
实体 (Entity):
实体是一个特殊的标识符,用于表示在文档中反复使用的数据片段。它们通常用于替代某些字符(如 <、>)或存储外部文件。
预定义实体:
< <!-- 小于符号 < -->
> <!-- 大于符号 > -->
& <!-- 与符号 & -->
示例:
<book>
<title>XML & HTML</title>
<description>这是一个包含特殊字符的文本,例如 < 和 >。</description>
</book>
在这个例子中,&
表示 &,<
表示 <,>
表示 >。这些实体保证了 XML 文件在解析时不会产生冲突。
实体可以是字符实体(如上述示例)或外部实体(如外部文件引用)。
PCDATA(parsed chatacter data):
XML 解析器通常会解析 XML 文档中所有的文本。
当某个 XML 元素被解析时,其标签之间的文本也会被解析:
<message>This text is also parsed</message>
解析器之所以这么做是因为 XML 元素可包含其他元素,就像这个实例中,其中的 元素包含着另外的两个元素(first 和 last):
<name><first>Bill</first><last>Gates</last></name>
而解析器会把它分解为像这样的子元素:
<name>
<first>Bill</first>
<last>Gates</last>
</name>
解析字符数据(PCDATA)是 XML 解析器解析的文本数据使用的一个术语。
CDATA(Character Data):
术语 CDATA 是不应该由 XML 解析器解析的文本数据。
像 “<” 和 “&” 字符在 XML 元素中都是非法的。
- “<” 会产生错误,因为解析器会把该字符解释为新元素的开始。
- “&” 会产生错误,因为解析器会把该字符解释为字符实体的开始。
某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。为了避免错误,可以将脚本代码定义为 CDATA。
CDATA 部分中的所有内容都会被解析器忽略。
CDATA 部分由 <![CDATA[
开始,由 ]]>
结束:
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1;
}
else
{
return 0;
}
}
]]>
</script>
在上面的实例中,解析器会忽略 CDATA 部分中的所有内容。
关于 CDATA 部分的注释:
CDATA 部分不能包含字符串 “]]>”。也不允许嵌套的 CDATA 部分。
标记 CDATA 部分结尾的 “]]>” 不能包含空格或换行。
XML特性
- 所有 XML 元素都须有关闭标签
- XML 标签对大小写敏感
- XML 必须正确地嵌套
- XML 文档必须有根元素
- XML 的属性值需要加引号
XML实体
XML 实体是对数据的引用,根据实体种类的不同,XML 解析器将使用实体的替代文本或者外部文档的内容来替代实体引用。
XML 实体由三部分构成: 一个与字符 &
, 一个实体名称, 以及一个分号 ;
。
XML 语言的规范中内置了各种实体。例如实体<
和>
代表字符 < 和 >。这些是
用于表示 XML 标签的元字符,因此当它们出现在数据中时,通常必须使用它们的实体来表示。
实体类别:
- 参数实体:用%声明,用%引用;在 DTD 中声明,在DTD中引用。
<!DOCTYPE book [
%author; <!-- 引用参数实体 -->
<!ENTITY % author "John Doe">
]>
<book>
<title>XML教程</title>
<author>%author;</author> <!-- 使用参数实体 -->
</book>
- 其余实体:直接用实体名称声明,使用&引用;在 DTD 中声明,在 XML 中引用。
<!DOCTYPE book [
<!ENTITY author "John Doe">
]>
<book>
<title>XML教程</title>
<author>&author;</author> <!-- 使用一般实体 -->
</book>
文档类型(DTD)
文档类型定义(DTD,Document Type Definition)可定义合法的 XML文档构建模块,它使用一系列合法的元素来定义文档的结构(文档中使用的标签、属性及其组合方式)。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用,也可以是两者的混合。
示例:
<?xml version="1.0"?>
<!DOCTYPE user [
<!-- 定义根元素为 user -->
<!ELEMENT user (username, password, userid, mail)> <!-- 定义 user 有四个子元素 -->
<!ELEMENT username (#PCDATA)> <!-- 定义子元素类型为 #PCDATA -->
<!ELEMENT password (#PCDATA)>
<!ELEMENT userid (#PCDATA)>
<!ELEMENT mail (#PCDATA)>
]>
<user>
<username>pinginglab</username>
<password>Pinker@123</password>
<userid>1</userid>
<mail>pinginglab@mail.com</mail>
</user>
DTD引用方式:
<!ELEMENT user (username, password, userid, mail)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ELEMENT userid (#PCDATA)>
<!ELEMENT mail (#PCDATA)>
#user.dtd文件
<?xml version="1.0"?>
<!DOCTYPE user SYSTEM "user.dtd">
<user>
<username>xiaoming</username>
<password>xiaoming@123</password>
<userid>1</userid>
<mail>xiaoming@mail.com</mail>
</user>
XML自定义实体
XML 允许在 DTD 中定义自定义实体。例如:
<!DOCTYPE foo [ <!ENTITY myentity "my entity value" > ]>
此定义意味着 XML 文档中对&myentity;实体引用的任何用法都将替换
为定义的值:“my entity value”。
XML外部实体
XML 外部实体是一种自定义实体,其定义位于声明它们的 DTD 之外。
外部实体的声明使用 SYSTEM 关键字,并且必须指定应从中加载实体值的URL。例如:
<!DOCTYPE foo [ <!ENTITY test SYSTEM "http://www.baidu.net" > ]>
URL 可以使用file://协议,因此可以从文件加载外部实体。例如:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [ <!ENTITY hosts SYSTEM "file:///etc/hosts" > ]>
<abc>&hosts;</abc>
默认支持协议
libxml2 | PHP | Java | .NET |
---|---|---|---|
file | file | http | http |
http | http | https | https |
ftp | ftp | ftp | ftp |
php | file | file | |
compress.zlib | jar | ||
compress.bzi | netdoc | ||
p2 | mailto | ||
data | gopher | ||
glob | |||
phar |