介绍
XML 指可扩展标记语言(eXtensible Markup Language)。被设计用来传输和存储数据,不用于表现和展示数据,而HTML 则用来表现数据。是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。
XML特点:
- ML 指可扩展标记语言(EXtensible Markup Language)。
- XML 是一种很像HTML的标记语言。
- XML 的设计宗旨是传输数据,而不是显示数据。
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准。
- XML 是独立于软件和硬件的信息传输工具。
XML 和 HTML 区别:
- XML 不是 HTML 的替代。
- XML 和 HTML 为不同的目的而设计:
- HTML 被设计用来显示数据,其焦点是数据的外观。XML 被设计用来传输和存储数据,其焦点是数据的内容。
- HTML 旨在显示信息,而 XML 旨在传输信息。
- HTML 中使用的标签都是预定义的。
- HTML 中使用的标签都是预定义的。XML 语言没有预定义的标签; 允许创作者定义自己的标签和自己的文档结构
用途:XML 应用于 Web 开发的许多方面,常用于简化数据的存储和共享。
- XML把数据从HTML分离
- XML简化数据共享
- 简化数据传输
- 简化平台变更
- 使数据更有用
- 用于创建新的互联网语言
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
- 元素
- 属性
- 实体
- PCDATA(parsed character data,解析字符数据)
- CDATA (character data,字符数据)
XML语法
XML 文档形成了一种树结构,它从”根部”开始,然后扩展到”枝叶”。
XML 文档必须包含根元素;该元素是所有其他元素的父元素;所有的元素都可以有子元素;父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹);所有的元素都可以有文本内容和属性(类似 HTML 中)
XML 声明 XML 声明文件的可选部分,如果存在需要放在文档的第一行
<?xml version="1.0" encoding="utf-8"?>XML根元素 XML 必须包含根元素,它是所有其他元素的父元素
<root> <child> <subchild>.....</subchild> </child></root>XML文档由元素构成,每个元素包括开始标签、结束标签和元素内容。
属性 元素可以包含属性,属性提供有关元素的附加信息。属性位于开始标签中。
<person age="30" gender="male">John Doe</person>单标签 所有的 XML 元素一般都有一个关闭标签,但也允许单标签的使用的
<elementName attribute="value" />单标签是指在一个标签中同时包含了开始和结束标签,形式类似于 HTML 中的空元素标签。
在XML中,你可以使用以下两种方式表示单标签:
使用空元素标签:
<exampleTag />使用开始和结束标签,但是不包含任何内容:
<exampleTag></exampleTag>XML 标签对大小写敏感。标签 <Letter> 与标签 <letter> 是不同的。必须使用相同的大小写来编写打开标签和关闭标签
实体引用
在 XML 中,一些字符拥有特殊的意义。
如果您把字符 ”<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始
这样会产生 XML 错误: <message>if salary < 1000 then</message>
用实体引用来代替 ”<” 字符:<message>if salary < 1000 then</message>
在 XML 中,有 5 个预定义的实体引用:
<表示 <>表示 >&表示 &'表示 ‘"表示 ”
存储换行
- 在 Windows 应用程序中,换行通常以一对字符来存储:回车符(CR)和换行符(LF)。
- 在 Unix 和 Mac OSX 中,使用 LF 来存储新行。
- 在旧的 Mac 系统中,使用 CR 来存储新行。
- XML 以 LF 存储换行
XML元素
XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
一个元素可以包含:
- 其他元素
- 文本
- 属性
- 或混合以上所有
命名规则
XML 元素必须遵循以下命名规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
最佳命名习惯
- 使名称具有描述性。使用下划线的名称也很不错:<first_name>、<last_name>。
- 名称应简短和简单,比如:<book_title>,而不是:<the_title_of_the_book>。
- 避免 ”-” 字符。如果您按照这样的方式进行命名:“first-name”,一些软件会认为您想要从 first 里边减去 name。
- 避免 ”.” 字符。如果您按照这样的方式进行命名:“first.name”,一些软件会认为 “name” 是对象 “first” 的属性。
- 避免 ”:” 字符。冒号会被转换为命名空间来使用。
- XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。有一个实用的经验,即使用数据库的命名规则来命名 XML 文档中的元素。
- 在 XML 中,éòá 等非英语字母是完全合法的,不过需要留意,您的软件供应商不支持这些字符时可能出现的问题
XML 元素是可扩展,以携带更多的信息 XML 的优势之一,就是可以在不中断应用程序的情况下进行扩展。
XML属性
XML元素具有属性,属性(Attribute)提供有关元素的额外信息。 xml属性值使用单引号或者双引号均可,但属性值必须加引号
在XML中尽量避免使用属性 尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息 因使用属性而引起的一些问题:
- 属性不能包含多个值(元素可以)
- 属性不能包含树结构(元素可以)
- 属性不容易扩展(为未来的变化)
- 属性难以阅读和维护
XML 实体
XML 实体是一种占位符机制,用于在 XML 文档中引用预定义的内容。可以把它理解为“变量”或“宏”,在解析时会被替换为实际的内容。
实体允许:
- 引用特殊字符(如
<、>、&) - 重复使用常用内容片段
- 引用外部文件内容
- 在 DTD 中定义可替换的内容
实体语法: 实体由三部分组成
- & 实体引用的开始标记
- 实体名称 实体的标识符
- ; 实体引用的结束标记
在 XML 中,有 5 个预定义的实体引用:
<表示 <>表示 >&表示 &'表示 ‘"表示 “
XML PCDATA
PCDATA (Parsed Character Data,可解析字符数据)
PCDATA 指的是会被 XML 解析器处理的文本内容。当解析器遇到 PCDATA 时,会:
- 解析其中的实体引用(如
<会被转换为<) - 解析其中的元素标签(如果包含子元素)
- 进行正常的 XML 语法检查
XML CDATA
XML 文档中的所有文本均会被解析器解析。只有 CDATA 区段中的文本会被解析器忽略。
DATA 部分由 "" 结束
<script><![CDATA[function matchwo(a,b){if (a < b && a < 0) then{return 1;}else{return 0;}}]]></script>PCDATA 与 CDATA对比:
| 对比维度 | PCDATA | CDATA |
|---|---|---|
| 全称 | Parsed Character Data | Character Data |
| 中文 | 可解析字符数据 | 字符数据(未解析) |
| 实体解析 | 会解析实体(如 <) | 不解析实体 |
| 标签解析 | 会解析子标签 | 不解析标签 |
| 使用场景 | 元素内容(会被解析的文本) | 不需要解析的文本块(如代码示例) |
| 语法 | 直接写在元素中 |
示例对比:
<element> <!-- PCDATA:< 会被解析为 < --> 5 < 10</element>
<element> <!-- CDATA:原样输出,不会解析 --> <![CDATA[5 < 10]]></element>XML 命名空间
当两个不同的文档使用相同的元素名时,就会发生命名冲突
在 XML 中的命名冲突可以通过使用名称前缀从而容易地避免。当在 XML 中使用前缀时,一个所谓的用于前缀的命名空间必须被定义。
命名空间是在元素的开始标签的 xmlns 属性中定义的。
命名空间声明的语法如下。xmlns:前缀="URI"。
** 分散声明**:
<root>
<h:table xmlns:h="http://www.w3.org/TR/html4/"><h:tr><h:td>Apples</h:td><h:td>Bananas</h:td></h:tr></h:table>
<f:table xmlns:f="http://www.w3cschool.cc/furniture"><f:name>African Coffee Table</f:name><f:width>80</f:width><f:length>120</f:length></f:table>
</root>集中声明
<root xmlns:h="http://www.w3.org/TR/html4/"xmlns:f="http://www.w3cschool.cc/furniture">
<h:table><h:tr><h:td>Apples</h:td><h:td>Bananas</h:td></h:tr></h:table>
<f:table><f:name>African Coffee Table</f:name><f:width>80</f:width><f:length>120</f:length></f:table>
</root>XML验证 (DTD)
DTD(文档类型定义,Document Type Definition,DTD)的作用是定义 XML 文档的合法构建模块。
使用DTD:
- 通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
- 通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
- 应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
- 还可以使用 DTD 来验证自身的数据。
DTD使用
DTD 有两种方式使用:内部声明和外部引用
内部声明
语法: <!DOCTYPE root-element [element-declarations]>
示例:
<?xml version="1.0"?><!DOCTYPE note [<!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>]><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend</body></note>其中DTD内容表示:
- !DOCTYPE note (第二行)定义此文档是 note 类型的文档。
- !ELEMENT note (第三行)定义 note 元素有四个元素:“to、from、heading,、body”
- !ELEMENT to (第四行)定义 to 元素为 “#PCDATA” 类型
- !ELEMENT from (第五行)定义 from 元素为 “#PCDATA” 类型
- !ELEMENT heading (第六行)定义 heading 元素为 “#PCDATA” 类型
- !ELEMENT body (第七行)定义 body 元素为 “#PCDATA” 类型
外部引用
语法:<!DOCTYPE root-element SYSTEM "filename">
示例:
xml文件:.xml
<?xml version="1.0"?><!DOCTYPE note SYSTEM "note.dtd"><note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body></note>DTD文件:.dtd
<!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>DTD写法
元素
声明元素
<!ELEMENT element-name category>或<!ELEMENT element-name (element-content)>空元素
<!ELEMENT element-name EMPTY>只有PCDATA元素
<!ELEMENT element-name (#PCDATA)>带任何内容元素
<!ELEMENT element-name ANY>带子元素(序列)的元素
<!ELEMENT element-name (child1)>或<!ELEMENT element-name (child1,child2,...)>当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。
<!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>** 声明只出现一次的元素**
<!ELEMENT element-name (child-name)>** 声明最少出现一次的元素** 使用**+**号
<!ELEMENT element-name (child-name+)>声明出现零次或多次的元素
<!ELEMENT element-name (child-name*)>声明出现零次或一次的元素
<!ELEMENT element-name (child-name?)>**声明“非…即…”类型的内容
<!ELEMENT note (to,from,header,(message|body))>**声明混合型的内容
<!ELEMENT note (#PCDATA|to|from|header|message)*>属性
在 DTD 中,属性通过 ATTLIST 声明来进行声明。
声明属性
<!ATTLIST element-name attribute-name attribute-type attribute-value>属性类型:
| 类型 | 描述 |
|---|---|
| CDATA | 值为字符数据 (character data) |
| (en1 | en2 |
| ID | 值为唯一的 id |
| IDREF | 值为另外一个元素的 id |
| IDREFS | 值为其他 id 的列表 |
| NMTOKEN | 值为合法的 XML 名称 |
| NMTOKENS | 值为合法的 XML 名称的列表 |
| ENTITY | 值是一个实体 |
| ENTITIES | 值是一个实体列表 |
| NOTATION | 此值是符号的名称 |
| xml: | 值是一个预定义的 XML 值 |
属性值:
| 值 | 解释 |
|---|---|
| 值 | 属性的默认值 |
| #REQUIRED | 属性值是必需的 |
| #IMPLIED | 属性不是必需的 |
| #FIXED value | 属性值是固定的 |
** 默认属性值**
<!ELEMENT square EMPTY><!ATTLIST square width CDATA "0">#REQUIRED 必需的
<!ATTLIST element-name attribute-name attribute-type #REQUIRED>#IMPLIED 不是必需的
<!ATTLIST element-name attribute-name attribute-type #IMPLIED>FIXED 固定的
<!ATTLIST element-name attribute-name attribute-type #FIXED "value">列举属性值
<!ATTLIST element-name attribute-name (en1|en2|..) default-value>实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。 实体引用是对实体的引用。 实体可在内部或外部进行声明。
内部实体声明
<!ENTITY entity-name "entity-value">外部实体声明
<!ENTITY entity-name SYSTEM "URI/URL">XML Schema
XML Schema 是基于 XML 的 DTD 替代者。 XML Schema 可描述 XML 文档的结构。 XML Schema 语言也可作为 XSD(XML Schema Definition)来引用。
XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。
XML Schema):
- 定义可出现在文档中的元素
- 定义可出现在文档中的属性
- 定义哪个元素是子元素
- 定义子元素的次序
- 定义子元素的数目
- 定义元素是否为空,或者是否可包含文本
- 定义元素和属性的数据类型
- 定义元素和属性的默认值以及固定值
XML 对数据类型的支持:
- 可更容易地描述允许的文档内容
- 可更容易地验证数据的正确性
- 可更容易地与来自数据库的数据一并工作
- 可更容易地定义数据约束(data facets)
- 可更容易地定义数据模型(或称数据格式)
- 可更容易地在不同的数据类型间转换数据
XML schema元素
未完待续
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时