XML基础入门(一)

基本 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![](http://dev.csdn.net/images/blog_csdn_net/bineon/28317/r_XIAN2_0201.gif)
 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接着我们看看特殊字符带来的问题。由于  &lt; 和  &gt; 是作为标记使用的,所以一般情况下我们不能在数据部分直接包含  &lt; 和  &gt; ,而是使用  &lt;  和  &gt;  ,其实这个问题在  html  里面就有了,处理方式也是和  html  一样,比如  &amp; 我们使用  &amp;  ,双引号  ”  使用  "  等。 
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  ”编码,这取决于开始的“  &lt; ? 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\.  没有  &lt; 或者  &amp; 等类似的字符出现在元素值或者属性值里面</person></person></person>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus