基本XML
我们先看一个例子:
Alan Turing
这就是一个标记完好的xml文件,和分别是开始标记和结束标记。
l 开始标记:以<开始,以>结束,中间是标记名称。
l 结束标记:以开始,以>结束,中间是标记名称。
注意:
开始标记和结束标记对应的标记名称必须相同,但是具体使用什么作为名称就没有规定,这个和html是不同的(html的标记名是若干个确定的),你可以使用person来标记一个人,使用cat来标记一只猫。
标记中间的Alan Turing就是数据,其中Alan和Turing之间的空格也是数据,也就是说标记里面的数据中的空格不会别忽略。
有时候我们也许需要没有任何数据的元素(元素指开始标记和结束标记之间的内容,包含开始标记和结束标记,比如上面提到的例子就是一个元素),例如下面的:
这是一个空标记,但是我们有另外更简捷的标记表示空标记:
注意:
xml是区分大小写的,这与html不同。和是不同标记,比如你有一个元素以开始,那么你就不能使用 Person >作为结束标记。
上面的例子指含有一个元素,我们现在给出一个复杂点的例子,然后给出xml树的概念。
Alan
Turing
显然上面的例子外层仍然是一个person元素,但是与先前不同的是这个元素含有4个子元素,1个name元素和3个profession元素。我们称person是name的父元素,显然他也是profession的父元素,同样我们可以看到name是first_name和last_name的父元素。
上面的例子我们发现标记进行了嵌套,这是允许的。但是重叠标记是非法的,比如:this common example from HTML
应该是:
this
common example from HTML
根据上面的例子中父子元素的关系以及注意到任何xml文件只能且只能含有一个根元素(也就是没有父元素的元素)看起来很象一个树,如图:
现在我们给出一个混合数据的xml文件的例子,
Alan Turing
was one of the first people to truly deserve the name
computer scientist. Although his contributions
to the field are too numerous to list, his best-known are the
eponymous Turing Test and
Turing Machine.
The Turing Test is to this day the standard
test for determining whether a computer is truly intelligent. This
test has yet to be passed.
The Turing Machine is an abstract finite
state automaton with infinite memory that can be proven equivalent
to any any other finite state automaton with arbitrarily large memory.
Thus what is true for a Turing machine is true for all equivalent
machines no matter how implemented.
Turing was also an accomplished
mathematician and
cryptographer. His assistance
was crucial in helping the Allies decode the German Enigma
machine. He committed suicide on June
7, 1954 after being
convicted of homosexuality and forced to take female
hormone injections.
上面的例子我不作解释,但是你要知道他是一个合法的xml文件,也就是说标记和内容可以混排。但是这样格式的xml文件在程序的处理上就很麻烦,所以不推荐使用。
接着我们谈谈属性(Attributes)。看例子:
born="1912-06-23" died="1954-06-07">
Alan Turing
其中红色标记的born和died就是属性。其中born是属性名,1912-06-23是属性值,属性值是用”筐起来的,当然也可以用单引号’筐起来。
Alan Turing
使用单引号的作用是你可以在属性的值里面添加双引号。
到这里我们发现一个问题:
这个例子中我在person元素里面添加了4个子元素,每个元素有自己的属性,以及对应的值,然后这4个元素都是空元素。对照前面我们给出的对应的例子,你觉得是把值限定在属性里面好还是直接放在标记之间好呢?这是一个争论不休的问题,我的看法是由你自己定,看哪个爽就使用哪个。但是要注意对同一个元素,他不能同时含有几个相同名称的属性。
born="1912-06-23" born="1954-06-07">
Alan Turing
上面的是非法的xml文件。
接着我们看看特殊字符带来的问题。由于<和>是作为标记使用的,所以一般情况下我们不能在数据部分直接包含<和>,而是使用<和> ,其实这个问题在html里面就有了,处理方式也是和html一样,比如&我们使用& ,双引号”使用"等。
再看看注释,方法和html是一样的:
但是注意注释的内容不能包含 -- ,同时注释里面的任何标记都会被忽略!同时需要注意的是注释不能出现在一个元素的标记里面。
现在我们从整体上来看xml:
1. xml声明
所有的xml文档可能(也应该!)由一个xml声明(XML Declaration)开始。虽然文档声
明使用的是同指令处理类似的语法,但从技术上讲,根据X M L推荐标准它们并不是一回事,因
为声明是xml中的保留部分。
Alan Turing
如果包括X M L声明,它必须处在文档最前面—前面不允许有任何空白或注释。严格地讲,
在X M L当中这种声明并不是必须的,但我们后面会看到,当处理文档时,它确实会起到一些优化的作用。
这些属性已经在XML 1.0规范中做出了定义:
? version—不能省略;值必须为“ 1 . 0”;该属性用来保证对X M L未来版本的支持。
? e n c o d i n g—可选;值必须是一种合法的字符编码,例如“ U T F - 8”、“U T F - 1 6”或者
“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。
如果没有包含这个属性,就假设是“ U T F - 8”或“ U T F - 1 6”编码,这取决于开始的“< ? x m l”字符串的格式。
? s t a n d a l o n e—可选;值必须是“ y e s”或“n o”;如果是“y e s”就意味着所有必须的实体声明都包含在文档中,如果是“ n o”就意味着需要外部的D T D。DTD将在后面介绍。
最后给出好的xml的相关要求:
1. 每个开始标记必须有一个结束标记匹配
2. 标记可以嵌套但是不能重叠
3. 每个xml文件只有一个根元素
4. 一个元素不能含有两个相同名字的属性
5. 注释不能出现在元素标记里面
6. 没有<或者&等类似的字符出现在元素值或者属性值里面