XML⽂件结构和基本语法
XML⽂件的结构性内容,包括节点关系以及属性内容等等。元素是组成XML的最基本的单位,它由开始标记,属性和结束标记组成。就是⼀个元素的例⼦,每个元素必须有⼀个元素名,元素可以若⼲个属性以及属性值。 xml⽂件和html⽂件⼀样,实际上是⼀个⽂本⽂件。显然⼤家⽴刻就会明⽩,创建xml⽂件最普通的⼯具和html⼀样,就是“记事本”了。⼀个xml⽂件的例⼦  现在我们暂且使⽤“记事本”来创建我们的xml⽂件吧。先看⼀个xml⽂件:  例1  〈?xml version="1.0" encoding="gb2312" ?〉  〈参考资料〉  〈书籍〉  〈名称〉xml⼊门精解〈/名称〉  〈作者〉张三〈/作者〉  〈价格货币单位="⼈民币"〉20.00〈/价格〉  〈/书籍〉  〈书籍〉  〈名称〉xml语法〈/名称〉  〈!--此书即将出版--〉  〈作者〉李四〈/作者〉  〈价格货币单位="⼈民
币"〉18.00〈/价格〉  〈/书籍〉  〈/参考资料〉  ——————————————————————  这是⼀个典型的xml⽂件,编辑好后保存为⼀个以.xml为后缀的⽂件。我们可以将此⽂件分为⽂件序⾔(prolog)和⽂件主体两个⼤的部分。在此⽂件中的第⼀⾏即是⽂件序⾔。该⾏是⼀个xml⽂件必须要声明的东西,⽽且也必须位于xml⽂件的第⼀⾏,它主要是告诉xml解析器如何⼯作。其
中,version是标明此xml⽂件所⽤的标准的版本号,必须要有;encoding 指明了此xml⽂件中所使⽤的字符类型,可以省略,在你省略此声明的时候,后⾯的字符码必须是unicode字符码(建议不要省略)。 
⽂件的其余部分都是属于⽂件主体,xml⽂件的内容信息存放在此。我们可以看到,⽂件主体是由开始的〈参考资料〉和结束的〈/参考资料〉控制标记组成,这个称为xml⽂件的“根元素”;〈书籍〉是作为直属于根元素下的“⼦元素”;在〈书籍〉下⼜有〈名称〉、〈作者〉、〈价格〉这些⼦元素。货币单位是〈价格〉元素中的⼀个“属性”,“⼈民币”则是“属性值”。元素与属性的关系如图1。  〈!--此书即将出版--〉这⼀句同html⼀样,是注释,在xml⽂件⾥,注释部分是放在“〈!--”与“--〉”标记之间的部分。  ⼤家可以看到,xml⽂件是相当简单的。同html⼀样,xml⽂件也是由⼀系列的标记组成,不过,xml⽂件中的标记是我们⾃定义的标记,具有明确的含义,我们可以对标记中的内容的含义作出说明。xml⽂件的语法  对xml⽂件有了初步的印象之后,我们就来详细地谈⼀谈xml⽂件的语法。在讲语法之前,我们必须要了解⼀个重要的概念,就是xml解析器(xml parse)。1. xml解析器  解析器的主要功能就是检查xml⽂件是否有结构上的错误,剥离xml⽂件中的标记,读出正确的内容,以交给下⼀步的应⽤程序处理。xml是⼀种⽤来结构化⽂件信息的标记语⾔,xml规范中对于如何标记⽂件的结构性有⼀个详细的法则,解析器就是根据这些法则写出来的软件(多⽤java写成)。2. well-formed的xml⽂件  我们知道,xml必须是well-formed的,才能够被解析器正确地解析出来,显⽰在浏览器中。那么什么是well-formed的xml⽂件呢?主要有下⾯⼏个准则,我们在创建xml⽂件的时候,必须满⾜它们。  ⾸先,xml⽂件的第⼀⾏必须是声明该⽂件是xml⽂件以及它所使⽤的xml规范版本。在⽂件的前⾯不能够有其它元素或者注释。  第⼆,在xml⽂件中有且只能够有⼀个根元素。我们的第⼀个例⼦中,〈参考资料〉... 〈/参考资料〉就是此xml⽂件的根元素。xml⽂件中,⽤的⼤多都是⾃定义的标记。  第三,在xml⽂件中的标记必须正确
地关闭,也就是说,在xml⽂件中,控制标记必须有与之对应的结束标记。如:〈名称〉标记必须有对应的〈/名称〉结束标记,不像html,某些标记的结束标记可有可⽆。如果在xml⽂件中遇到⾃成⼀个单元的标记,就是类似于html 中的〈img src=.....〉的这些没有结束标记的时候,xml把它称为“空元素”,必须⽤这样的写法:〈空元素名/〉,如果元素中含有属性时写法则为:〈空元素名属性名=“属性值”/〉。  第四,标记之间不得交叉。在以前的html⽂件中,可以这样写:  〈b〉〈h〉xxxxxxx〈/b〉〈/h〉,〈b〉和〈h〉  标记之间有相互重叠的区域,⽽在xml中,是严格禁⽌这样标记交错的写法,标记必须以规则性的次序来出现。  第五,属性值必须要⽤“ ”号括起来。如第⼀个例⼦中的“1.0”、“gb2312”、“⼈民币”。都是⽤“ ”号括起来了的,不能漏掉。  第六,控制标记、指令和属性名称等英⽂要区分⼤⼩写。与html不同的是,在html中,类似〈b〉和〈b〉的标记含义是⼀样的,⽽在xml中,类似〈name〉、〈name〉或〈name〉这样的标记是不同的。  第七,我们知道,在html⽂件中,如果我们要浏览器原封不动地将我们所输⼊的东西显⽰出来,可以将这些东西放到〈pre〉〈/pre〉或者〈xmp〉〈/xmp〉标记中间。这对于我们创建html教学的⽹页是必不可少的,因为⽹页中要显⽰html的源代码。⽽在xml中,要实现这样的功能,就必须使⽤ cdata标记。在cdata标记中的信息被解析器原封不动地传给应⽤程序,并且不解析该段信息中的任何控制标记。cdata区域是由:“〈! [cdata[”为开始标记,以“]]〉”为结束标记。例如:例2中的源码,除了“〈![cdata[”和“]]〉”符号,其余的内容解析器将原封不动地交给下游的应⽤程序,即使cdata区域中的开始和结尾的空⽩以及换⾏字符等,都同样会被转交(注意cdata是⼤写的字符)。
1  XML 的声明
<?xml version=”1.0” standalone=”yes” encoding=”UTF-8”?>
这是⼀个XML处理指令。处理指令以 <? 开始,以 ?> 结束。<? 后的第⼀个单词是指令名,如xml, 代表XML声明。
version, standalone, encoding 是三个特性,特性是由等号分开的名称-数值对,等号左边是特性名称,等号右边是特性的值,⽤引号引起来。
⼏点解释:
version: 说明这个⽂档符合1.0规范
standalone: 说明⽂档在这⼀个⽂件⾥还是需要从外部导⼊, standalone 的值设为yes 说明所有的⽂档都在这⼀⽂件⾥完成
encoding: 指⽂档字符编码
2  XML 根元素定义
XML⽂档的树形结构要求必须有⼀个根元素。根元素的起始标记要放在所有其它元素起始标记之前,根元素的结束标记根放在其它所有元素的结束标记之后,如
<?xml version=”1.0” standalone=”yes” encoding=”UTF-8”?>
<Settings>
<Person>Zhang San</Person>
</Settings>
3  XML元素
元素的基本结构由开始标记,数据内容,结束标记组成,如
<Person>
<Name>Zhang San</Name>
<Sex>Male</Sex>
</Person>
需要注意的是:
元素标记区分⼤⼩写,<Name> 与 <name>是两个不同的标记
结束标记必须有反斜杠,如 </Name>
XML元素标记命名规则如下:
名字中可以包含字母,数字及其它字母
名字不能以数字或下划线开头
名字不能⽤xml开头
名字中不能包含空格和冒号
4  XML中的注释
XML中注释如下:
<!-- this is comment -->
需要注意的是:
注释中不要出现“--”或“-”
注释不要放在标记中
注释不能嵌套
5  PI  (Processing Instruction)PI 指 Processing Instruction, 处理指令。PI以“<?”开头,以“?>”结束,⽤来给下游的⽂档传递信息。<?xml:stylesheet href=”core.css” type=”text/css” ?>
例⼦表明这个XML⽂档⽤core.css控制显⽰。
6  PCDATA  #PCDATA: specifies that an element will contain parsed character data.
举例说明PCDATA的⽤法, 其中l 存储电影内容数据,movies.dtd对l进⾏验证。
⽰例⽂件(movies.dtd)
<?xml version="1.0" encoding="GB2312"?>
<!ELEMENT movies (id, name, brief, time)>
<!ATTLIST movies type CDATA #REQUIRED>
<!ELEMENT id (#PCDATA)>创建html文件
<!ELEMENT name (#PCDATA)>
<!ELEMENT brief (#PCDATA)>
<!ELEMENT time (#PCDATA)>
id, name, brief, time只能包含⾮标记⽂本(不能有⾃⼰的⼦元素)。
XML⽂件如下所⽰(l):
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE movies SYSTEM "movies.dtd">
<movies type="动作⽚">
<id>1</id>
<name>致命摇篮</name>
<brief>李连杰最新⼒作</brief>
<time>2003</time>
</movies>
7  CDATA
CDATA⽤于需要把整段⽂本解释成纯字符数据⽽不是标记的情况。当⼀些⽂本中包含很多“<”,“>”,“&”,“””等字符⽽⾮标记时,CDATA会⾮常有⽤。
<Example>
<![CDATA[
<Person>
<Name>ZhangSan</Name>
<Sex>Male</Sex>
</Person>
]]>
</Example>
以“<![CDATA[” 开始,以“]]>”结束。注意,在CDATA段中不要出现结束定界符“]]>”。
8  Entities(实体)Entities(实体)是XML的存储单元,⼀个实体可以是字符串,⽂件,数据库记录等。实体的⽤处主要是为了避免在⽂档中重复输⼊,我们可以为⼀个⽂档定义⼀个实体名,然后在⽂档⾥引⽤实体名来代替这个⽂档,XML解析⽂档时,实体名会被替换成相应的⽂档。XML为五个字符定义了实体名:
实体字符
<<
>>
&&
"“
'‘
定义并引⽤实体的⽰例:
<!DOCTYPE example [
<!ENTITY intro "Here is some comment for entity of XML">
]>
<example>
<hello>&intro;</hello>
</example>
9  DOCTYPE “<!DOCTYPE[]>”紧随XML声明,包括所有实体的声明,如下所⽰:
<!DOCTYPE example [
declare your entities here…
]
>
<example>
Body of document…
</example>