基本 XML
讨论 xml 文件以前我们先看一个例子:
1<person>
2
3Alan Turing
4
5</person>
这就是一个标记完好的 xml 文件,
1<person> 和 </person>
分别是开始标记和结束标记。
l 开始标记:以 < 开始,以 > 结束,中间是标记名称。
l 结束标记:以
结束,中间是标记名称。
** 注意: ** 开始标记和结束标记对应的标记名称必须相同,但是具体使用什么作为名称就没有规定,这个和 html 是不同的( html 的标记名是若干个确定的),你可以使用 person 来标记一个人,使用 cat 来标记一只猫。
标记中间的 Alan Turing 就是数据,其中 Alan 和 Turing 之间的空格也是数据,也就是说标记里面的数据中的空格不会别忽略。
有时候我们也许需要没有任何数据的元素(元素指开始标记和结束标记之间的内容,包含开始标记和结束标记,比如上面提到的例子就是一个元素),例如下面的:
1<person></person>
这是一个空标记,但是我们有另外更简捷的标记表示空标记:
1<person></person>
** 注意: ** xml 是区分大小写的,这与 html 不同。 `
1<person> ` ` 和 <person> 是不同标记,比如你有一个元素以 <person> 开始,那么你就不能使用 <!-- ` ` Person --> ` ` 作为结束标记。 `
2
3上面的例子指含有一个元素,我们现在给出一个复杂点的例子,然后给出 xml 树的概念。
4
5
6 <person>
7<name>
8<first_name>Alan</first_name>
9<last_name>Turing</last_name>
10</name>
11<profession> computer scientist </profession>
12<profession> mathematician </profession>
13<profession> cryptographer </profession>
14</person>
15
16显然上面的例子外层仍然是一个 person 元素,但是与先前不同的是这个元素含有 4 个子元素, 1 个 name 元素和 3 个 profession 元素。我们称 person 是 name 的父元素,显然他也是 profession 的父元素,同样我们可以看到 name 是 first_name 和 last_name 的父元素。
17
18上面的例子我们发现标记进行了嵌套,这是允许的。但是重叠标记是非法的,比如:
19` <strong><em> ` ` this ` ` common ` ` example ` ` from ` ` HTML </em></strong> ` ` `
20
21` 应该是: `
22
23` <strong><em> ` ` this ` ` common ` ` example ` ` from ` ` HTML </em></strong> `
24
25根据上面的例子中父子元素的关系以及注意到任何 xml 文件只能且只能含有一个根元素(也就是没有父元素的元素)看起来很象一个树,如图:
26
27
28
29现在我们给出一个混合数据的 xml 文件的例子,
30
31
32 <biography>
33
34
35 <name><first_name>Alan</first_name> <last_name>Turing</last_name>
36
37
38 </name> was one of the first people to truly deserve the name
39
40
41 <emphasize>computer scientist</emphasize>. Although his contributions
42
43
44 to the field are too numerous to list, his best-known are the
45
46
47 eponymous <emphasize>Turing Test</emphasize> and
48
49
50 <emphasize>Turing Machine</emphasize>.
51
52
53
54
55
56 <definition>The <term>Turing Test</term> is to this day the standard
57
58
59 test for determining whether a computer is truly intelligent. This
60
61
62 test has yet to be passed. </definition>
63
64
65
66
67
68 <definition>The <term>Turing Machine</term> is an abstract finite
69
70
71 state automaton with infinite memory that can be proven equivalent
72
73
74 to any any other finite state automaton with arbitrarily large memory.
75
76
77 Thus what is true for a Turing machine is true for all equivalent
78
79
80 machines no matter how implemented.
81
82
83 </definition>
84
85
86
87
88
89 <name><last_name>Turing</last_name></name> was also an accomplished
90
91
92 <profession>mathematician</profession> and
93
94
95 <profession>cryptographer</profession>. His assistance
96
97
98 was crucial in helping the Allies decode the German Enigma
99
100
101 machine. He committed suicide on <date><month>June</month>
102
103
104 <day>7</day>, <year>1954</year></date> after being
105
106
107 convicted of homosexuality and forced to take female
108
109
110 hormone injections.
111
112
113 </biography>
114
115上面的例子我不作解释,但是你要知道他是一个合法的 xml 文件,也就是说标记和内容可以混排。但是这样格式的 xml 文件在程序的处理上就很麻烦,所以不推荐使用。
116
117接着我们谈谈属性( Attributes )。看例子:
118
119<person born=" 1912-06-23 " died=" 1954-06-07 ">
120
121Alan Turing
122
123</person>
124
125其中红色标记的 born 和 died 就是属性。其中 born 是属性名, 1912-06-23 是属性值,属性值是用 ” 筐起来的,当然也可以用单引号 ’ 筐起来。
126
127<person born=" 1912-06-23 " died=" 1954-06-07 ">
128
129Alan Turing
130
131</person>
132
133使用单引号的作用是你可以在属性的值里面添加双引号。
134
135到这里我们发现一个问题:
136
137<person>
138<name first="Alan" last="Turing"></name>
139<profession value="computer scientist"></profession>
140<profession value="mathematician"></profession>
141<profession value="cryptographer"></profession>
142</person>
143
144这个例子中我在 person 元素里面添加了 4 个子元素,每个元素有自己的属性,以及对应的值,然后这 4 个元素都是空元素。对照前面我们给出的对应的例子,你觉得是把值限定在属性里面好还是直接放在标记之间好呢?这是一个争论不休的问题,我的看法是由你自己定,看哪个爽就使用哪个。但是要注意对同一个元素,他不能同时含有几个相同名称的属性。
145
146<person born=" 1954-06-07 ">
147
148Alan Turing
149
150</person>
151
152上面的是非法的 xml 文件 。
153
154接着我们看看特殊字符带来的问题。由于 < 和 > 是作为标记使用的,所以一般情况下我们不能在数据部分直接包含 < 和 > ,而是使用 < 和 > ,其实这个问题在 html 里面就有了,处理方式也是和 html 一样,比如 & 我们使用 & ,双引号 ” 使用 " 等。
155
156再看看注释,方法和 html 是一样的:
157
158<!-- 左边的是注释开始标记,右边的是结束标记 \-->
159
160但是注意注释的内容不能包含 \-- ,同时注释里面的任何标记都会被忽略!同时需要注意的是注释不能出现在一个元素的标记里面。
161
162现在我们从整体上来看 xml :
163
1641\. xml 声明
165
166所有的 xml 文档可能(也应该!)由一个 xml 声明( XML Declaration )开始。虽然文档声
167
168明使用的是同指令处理类似的语法,但从技术上讲,根据 X M L 推荐标准它们并不是一回事,因
169
170为声明是 xml 中的保留部分。
171
172<?xml version="1.0" encoding="ASCII" standalone="yes"?>
173<person>
174
175Alan Turing
176
177</person>
178
179如果包括 X M L 声明,它必须处在文档最前面—前面不允许有任何空白或注释。严格地讲,
180
181在 X M L 当中这种声明并不是必须的,但我们后面会看到,当处理文档时,它确实会起到一些优化的作用。
182
183这些属性已经在 XML 1.0 规范中做出了定义:
184
185? version —不能省略;值必须为“ 1 . 0 ” ;该属性用来保证对X M L 未来版本的支持。
186
187? e n c o d i n g —可选;值必须是一种合法的字符编码,例如“ U T F - 8 ” 、“U T F - 1 6 ” 或者
188
189“ I S O - 8 8 5 9 - 1 ”(即 L a t i n - 1 字符编码)。所有 X M L 解析器都要求至少支持 U T F - 8 和 U T F - 1 6 。
190
191如果没有包含这个属性,就假设是“ U T F - 8 ”或“ U T F - 1 6 ”编码,这取决于开始的“ < ? x m l ”字符串的格式。
192
193? s t a n d a l o n e —可选;值必须是“ y e s ”或“ n o ”;如果是“ y e s ”就意味着所有必须的实体声明都包含在文档中,如果是“ n o ”就意味着需要外部的 D T D 。 DTD 将在后面介绍。
194
195最后给出好的 xml 的相关要求:
196
1971\. 每个开始标记必须有一个结束标记匹配
198
1992\. 标记可以嵌套但是不能重叠
200
2013\. 每个 xml 文件只有一个根元素
202
2034\. 一个元素不能含有两个相同名字的属性
204
2055\. 注释不能出现在元素标记里面
206
2076\. 没有 < 或者 & 等类似的字符出现在元素值或者属性值里面</person></person></person>