可能你还不了解XML,只是听说课水分高就报了(我也是),那就跟着我的笔记,来一起了解XML吧!

本系列笔记适合读过课本后过来进行总结,所以还是要先预习啊(双关)

注:这系列的笔记将多采用Q E C形式,即 Question Evidence Conclusion 的形式

XML基础知识

1.1 XML及其相关技术概述

Q1:什么是XML?

C1:XML(eXtensible Markup Language),即可扩展性标记语言,是标记语言中的一种。

Q2:什么是标记?

C2:标记是指计算机所能理解的信息符号,通过标记,计算机之间可以相互表示包含各种信息的文档。

1.1.1 XML的发展史

Q3:标记语言(ML)的发展过程是什么?

C3:

  1. SGML,它是XML的前身,由三部分构成,即语法定义、文件类型定义DTD和文件实例。但由于它过于庞大复杂,难以理解学习,真正大行其道的是其子集,如HTML和XML。
  2. HTML,它是SGML的一种实际应用,其DTD作为标准被固定下来。因此,HTML的功能单一,只能用于编写网页
  3. XML,它是一套使用上规则严谨,但是语法简单的信息描述语言。它的目的是以一种更中立的方式,让用户自行决定要如何理解、呈现从服务端所提供的信息,而着重表示数据以及数据之间的联系。

1.1.2 XML的特点

Q4:XML的特点主要包含什么?

C4:主要包含四个方面:

  1. 可扩展性:XML允许使用者创建和使用他们自己的标记,而不是HTML的有限词汇表。
  2. 灵活性:XML提供了一种结构化的数据表示方式,使得用户界面分离于结构化数据,使得Web用户所追求的许多先进功能在XML环境下更容易实现。
  3. 自描述性:XML文档通常包含一个文档类型声明,不仅人能读懂,计算机也能处理,XML表示数据的方式真正做到了独立于应用系统,并且数据能够重用。

示例文档

  1. 简洁性:XML比完整的SGML简单得多,易学、易用并且以实现

XML文档包含三个不同的组成部分:

  1. 数据内容:即文档本身(对应XML

  2. 结构:文档类型及其元素的组织形式,文档包括何种类型的元素,以及他们的排列次序(对应DTD/SCHEMA)

  3. 表现形式:在一张纸上、浏览器屏幕上向读者描述数据的方法,还有对每种元素类型使用何种字体等。(对应XSL/CSS)

1.1.3 XML的实际应用

XML 成为一种与平台无关的、数据表示数据交换的载体。

1.2 XML规范及XML文档分类

XML文档实际上是一个文本文件,但并不是任何文本文件都是正确的XML文档,W3C的XML1.0规范对XML文档的语法格式进行了严格的定义。

1.2.1 XML文档中的XML声明

Q5:声明有哪些特点和注意事项?

E5:

1
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

C5:

XML声明部分本身是可选的(可以没有声明)。但如果包含声明部分,必须是整个XML文档的第一行内容(第一行不能为注释或空行)。<?xml要顶格,且中间无空格。

完整的 XML 声明包括三个部分:

(1) 版本声明 (version)通常情况下为1.0,在声明中是必须的,并且必须为作为第一个属性出现。

(2) 编码声明 (encoding)该属性的取值用于指明当前XML文档中所使用的符号的编码方式。一般采用”UTF-8”,这个属性是可选的(默认为UTF-8)。

注:这个编码方式与XML在文档在系统中保存时使用的编码方式没有直接关系

(3) 文档独立性声明 (standalone)该属性的取值表明当前XML文件是否独立使用、还是与其他标记文件配套使用。若为“yes”,则解析当前XML文档时无需其他的外部标记声明文件。若为”no“,则可能需要使用外部的标记声明文件。这个属性是可选的。

示例中,no的原因是因为该文档引用了外部1.ent中定义的实体:&nbsp

如果存在外部标记声明,且没有standalone声明,则解析器将认为standalone的值为no

如果有encoding 属性和standalone属性,那么encoding属性必须放standalone属性前面

1.2.2 处理指令和注释

Q6:什么是处理指令?

E6:

1
<?xml-stylesheet href="style.xsl" type="text/xsl"?>

C6:处理指令是表示将XML文档用于特殊的应用程序时表示需要执行的特定操作,而XML解析器不会执行特定的操作。

语法格式:<? target-name data ?>

其中,<?和?>表示处理指令的开始与结束;target-name表示该处理指令的名称,data部分描述该指令的具体内容。E6的含义为:当XSL的执行引擎碰到这个处理指令时,将会根据href的取值获得指定的xsl文件,并对输入的xml文档进行相应的转换。

Q7:注释的注意事项是什么?

C7:语法格式 <!--......-->,与HTML一致。

​ 在注释的内容中,不应该出现两个连续的横线

​ 注释不应该出现在元素的标记中,注释之中不应该嵌套注释

1.2.3 XML文档中的元素和属性

Q8:什么是元素?

E8:

1
2
3
<element_name att1="val1" att2="val2">
...content...
</element_name>

C8:元素是最基本的组成单元,在元素的开始标记中还可以包含相关的属性。元素中可以包含文本、子元素、或者两者的组合。可以存在空元素,即不包含任何内容的元素,但它可以包含属性

1
2
3
<details></details>
<details/><!--上述两种空元素是等价的-->
<details about="Location"></details><!--空元素可以包含属性-->

一个元素可以包含任意多个子元素,可以包含多个同名的子元素;子元素的顺序非常重要

Q9:什么是属性?

E9:

1
<author firstname="Tom" lastname="hanks"></author>

C9:属性不能独立于元素而存在,通常以名-值对的形式出现,用于描述当前元素的某个方面的特征。

属性的取值必须加上引号(单引号或者双引号)

元素在其开始标记中可以包含任意多个属性,但不能包含同名的属性

对于一个元素所有的属性,它们不分先后顺序,因为它们之间可以通过名称相互区别。

Q10:如何命名元素和属性?

E10:

1
2
<example-one/> <_example2/> <:Example.Three/> <!--这些标记名称都是正确的-->
<bad*character/> <illegal space/> <12number-start/><!--这些都是错误的-->

C10:

  1. 名称的开头必须以字母、下划线或者冒号开头。
  2. 除开头之外的其他部分可以是字母、数字、横线(-)、下划线、点号(.)、冒号的任意组合。
  3. 元素名称分大小写
  4. 元素和属性的名称长度没有限制。
  5. 可以使用非英文的元素名。

Q11:如何选择子元素和属性的使用?

C11:

  1. 对于简单的标量数据(无结构的数据),可以采用属性,否则应该采用子元素。
  2. 对于可能在数目上发生变化的特性,应该使用子元素,比如某本书籍可能有多个作者。

1.2.4 XML文档中的文本内容和CDATA段

在文本内容中,一些符号会产生歧义,使得解析器不能正确辨识。比如

1
<lessthan>one<two</lessthan> <!--文本中的小于号产生了歧义-->

XML 1.0 规范中定义了五种预定义实体:而除此以外的的其他实体,必须在使用前进行声明

1
<lessthan>one &it;two</lessthan>

注:预定义实体以&表示实体的开始最后有一个分号表示实体的结束,容易遗漏,特别注意

Q12:什么是CDATA段?

E12:

1
2
3
<customer>
<name><![CDATA[YOU & ME,<Tom>&<Jerry>]]></name>
</customer>

C12: 假设XML文档的某块文本内容中包含大量的特殊字符,那么可以将整个文本块的内容放入到一个CDATA段中

即:<![CDATA[]]>

使用 CDATA 段,可以告诉解析器不要试图从该文本块中查找 XML 标记它仅仅就是文本内容,从而避免了歧义的产生,因此可以使用非法字符

同理,CDATA段的文本内容中不能直接出现]]>,并且CDATA段不应该嵌套使用。(与注释类似)

Q13:什么是空白字符?

C13:XML文档中的空白字符包括空格、回车、换行、制表等四种符号。

注:在缺省的情况下,对于连续出现的空白字符,解析器会将其缩减为一个空格字符。如果准备显示标记包含的全部空格,在编辑xml文件时将输入法换成“中文”输入法,并选择“全角状态”来编辑空格字符

1.2.5 XML文档的良构性规则

Q14:良构的XML文档要满足什么要求?

C14:

  1. 开始标记必须与结束标记相对应。
  2. 标记是大小写敏感的。
  3. 标记必须正确的嵌套。
1
<book><author>tom hanks</book></author> <!--这是错误的-->
  1. 属性值必须使用引号括起来:
1
<details about=Location/> <!--不加引号是错误的,可加单引号或双引号-->
  1. 有且只有一个根元素。
1
2
<author>tom hanks</author>
<author>mike jimmy</author><!--这段内容称为XML片段-->

1.2.6 XML文档的分类

XML 既可以是面向数据(Data Centric)的,又可以是面向文档(Document Centric)的。

面向数据的文档主要利用 XML 来传送应用数据,这些文档包括销售订单(参见 data-centric.xml)、病人记录和科学数据等。

面向数据的 XML 文档的物理结构,如元素的顺序、或者数据被存储为属性还是子元素,通常不是很重要。它们的特征是高度有序的结构,并且同时带有那些数据结构的多个项目,类似于关系数据库系统中的多条记录。

面向文档的 XML 文件几乎没有结构,元素结构粗糙。面向文档的文档是利用 XML 来获取自然(人类)语言的那些文档,如留言信息(参见 doc-centric.xml)、用户手册。

它们以复杂或无规则的结构和混合内容为特征,而且文档的物理结构非常重要。这些文档的处理侧重于给用户提供信息的最终表示,因此它们也被称作面向表示的文档。

1.3 命名空间

Q15:什么是命名空间?

C15:命名空间 (namespace) 主要是通过某种形式来表示标识符 (identifier) 的上下文,可以将逻辑上相关的标识符组织成相应的命名空间,可使整个系统更加模块化。

1.3.2 XML中命名空间的声明和使用

Q16:如何声明命名空间?

E16:

1
2
3
<myns:element xmlns:myns="http://www.myns.com">
.....
</myns:element>

C16:声明XML命名空间的语法为:xmlns:prefix-name=”URI”。其中,xmlns是XML的保留属性,用来声明命名空间。命名空间的前缀名称是以字母或下划线(_)开头的、不包含空白字符和冒号(:)的字符串,通常规定不应该使用 XML 中的保留字,比如 xml、xsl 等等。

对于例子,myns:element表示element元素属于myns这个命名空间,而myns只是命名空间的简称,后面的语句才是命名空间的声明,表示myns命名空间的全程为字符串”http://www.myns.com"。

Q17:为什么不建议用简短的字符串作为命名空间的全称?

C17:为了减少不同命名空间标识符冲突的可能性。

Q18:怎样使用缺省命名空间?

E18:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<company xmlns="http://www.myns.com">
<company-info>
<name>SoftwareBG</name>
<fdate>2007-03-17</fdate>
<ns1:division xmlns:ns1="http://www.myns.com/division">
<ns1:name>Development</ns1:name>
<ns1:employees>100</ns1:employees>
</ns1:division>
</company-info>
</company>

C18:由例子:根元素company的开始标记中声明了一个无前缀名的命名空间,它的作用范围为整个XML文档。因此在该文档中,任何没有显示地指定命名空间的元素和属性(即除了disivion命名空间下的其他),都属于这个缺省的无名命名空间。

教学要求:能较系统地了解XML及其相关技术概述,XML在各个领域方面的应用,XML规范及XML文档分类,命名空间,XML数据模型规范等;

1.4 XML文档的数据模型规范

以下片段都将转化为<a b='upcase'> Hello! </a>

1
2
<a b='upcase'> <[CDATA[Hello!]]> </a>
<a b='upcase'> Hello&#33 </a>

XML第一章的内容都属于基础,比较简单,多考于选择题,因此需要广覆盖知识点,不要在这里失分。