XML(eXtensible Markup Language)

发布于:2025-02-24 ⋅ 阅读:(163) ⋅ 点赞:(0)

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):

实体是一个特殊的标识符,用于表示在文档中反复使用的数据片段。它们通常用于替代某些字符(如 <、>)或存储外部文件。
预定义实体:

&lt;   <!-- 小于符号 < -->
&gt;   <!-- 大于符号 > -->
&amp;  <!-- 与符号 & -->

示例:

<book>
  <title>XML &amp; HTML</title>
  <description>这是一个包含特殊字符的文本,例如 &lt;&gt;</description>
</book>

在这个例子中,&amp; 表示 &,&lt; 表示 <,&gt; 表示 >。这些实体保证了 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 语言的规范中内置了各种实体。例如实体&lt;&gt;代表字符 < 和 >。这些是
用于表示 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

网站公告

今日签到

点亮在社区的每一天
去签到