一、xml的基本语法、
1.XML文档只能包含一个根元素。XML文档的根元素是包含所有被视为文档本身内容的单个元素。根元素是在文档的序言码部分后出现的第一个元素,它也称为文档元素。
2.所有XML元素必须包含结束标记。
3.元素的开始标记和结束标记的名称必须相同。XML区分大小写,因此结束标记名称必须与其伴随的开始标记名称完全匹配。
4.XML元素不能重叠。如果一个元素的开始标记出现在另一个元素中,则该元素的结束标记也必须包含在其中。
5.所有属性值都必须使用引号。属性值必须用单引号或双引号括起来。
6.在XML文档的文本中不能使用“<”、“>”、“&”3个字符,这些都是对于XML分析程序具有特定含义的特殊字符。如果需要在XML文档的文本中使用这些字符,则应使用预定义的字符或实体引用。
二、xml的基本结构
XML文档包含7个主要部分:序言码、处理指令、根元素、元素、属性、CDATA节和注释。
1.序言码
序言码是XML文档的第一部分。序言码包含XML声明(表明该文档是XML文档)、处理指令(提供XML分析程序用于确定如何处理文档的信息)和架构声明(确定用于验证文档是否有效的XML架构)。以下是XML文档中序言码的示例:
<?xml version="1.0" encoding="gb2312"?>
2. 处理指令
处理指令是用来给处理XML文档的应用程序提供信息的,XML分析器把这些信息原封不动地传给应用程序,由应用程序来解释这个指令,遵照它所提供的信息进行处理。处理指令应该遵循下面的格式:<?处理指令名 处理指令信息?>
如:<?xml-stylesheet type="text/xsl" href="book.xsl"?>
3. 根元素
根元素是XML文档的主要部分,它包含文档的数据以及描述数据结构的信息。以下是XML文档中根元素部分的示例。
<books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
…
</books>
根元素中的信息存储在两种类型的XML结构中:元素和属性。XML文档中使用的所有元素和属性都嵌套在根元素中。
4. 元素
元素是XML文档的基本构成单元,它用于表示XML文档的结构和XML文档中包含的数据。元素包含开始标记、内容和结束标记。由于XML区分大小写,所以,开始标记和结束标记必须完全匹配。以下是描述书籍信息的示例,publish元素下有3个有关出版社的子元素。
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768-8</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
元素可以包含文本、其他元素、字符引用或字符数据部分。没有内容的元素称为空元素。空元素的开始标记和结束标记可以合并为一个标记,例如:<sale/>
5. 属性
属性是使用与特定元素关联的对应“名称—值”的XML构造。其中包含的有关元素内容的信息并非总是用于显示,而是用于描述元素的某种属性。使用等号分隔属性名称和属性值,并且包含在元素的开始标记中。属性值包含在单引号或双引号中。以下是与book元素关联的bookcategory等4个属性的示例。
<books>
<book id="018" bookcategory="计算机" amount="560" remain="200" discount="8.2">
</book>
</books>
6. CDATA
在标记CDATA下,所有的标识、实体引用都被忽略,而被XML处理程序一视同仁地作为字符数据看待。CDATA的形式如下。该标记中的代码包括文字和标记都要当成纯文本来解析,并原封不动的将这段代码传给下一个XML应用程序。
<![CDATA[ 文本内容 ]] >
CDATA的文本内容中不能出现字符串“]]>”,另外,CDATA不能嵌套。
7. 注释
XML文档可以包含注释,也可以没有这项内容。注释并不由XML分析程序进行处理,但用于在文档的XML源代码中提供必要的说明。注释以“<!--”开始,并以“-->”结束。在这些字符之间的文本会被XML分析程序忽略。以下是XML文档中注释的示例。
三、注意事项
标记名字,属性,文档中其他实体的字符串必须满足以下要求
(1) 名称的开头必须是字母或“_”;
(2) 标记名称中不能有空格;
(3) 名称的字符串只能包含英文字母、数字、“_”、“-”、“.”等字符。
标记对大小写敏感。
四、XML中的特殊字符表
特殊字符 | 代替符号 | 特殊的原因 |
& | & | 每一个代表符号的开头字符 |
> | > | 标记的结束字符 |
< | < | 标记的开始字符 |
" | " | 设定属性的值 |
' | ' | 设定属性的值 |
五、XML名称空间
XML名称空间提供了一套简单的方法,将XML文档和URI引用标记的名称相结合,来限定其中的元素和属性名。由此可知它通过使用URI,解决了XML文档中标记重名的问题。
1.名称空间的声明
在使用名称空间之前,必须首先进行声明,名称空间的声明类似于前面元素的声明,将一个唯一的标识符号指定到一个URI或其他合法字符串上,使用前面定义的标识符号作为标记的前缀,表示一类标记的出处。
如:
<book:bookinfo xmlns:book="http://bestbook.jmu.edu.cn/cs/textbook">
<book:title>计算机导论</book:title>
<book:author>丁跃潮等</book:author>
<book:price>19.7</book:price>
</book:bookinfo>
xmlns是一个专门用来指定名称空间的关键字,book是为了XML文档中使用方便而随便起的一个名字,它被用来标识字符串“http://bestbook.jmu.edu.cn/cs/textbook”。因为通常情况之下,后面的URI很长,使用起来和读起来都很不方便,而“book”就是给该长字符串临时起的一个简短好用的名字,它可以是任意合法的字符串。
a.多个声明空间的使用
注意在声明名称空间时可以将多个声明结合在一起,例如下面语句:
<book:bookinfo xmlns:book1="http://bestbook.jmu.edu.cn/cs/textbook"
xmlns:book2="http://cheapbook.jmu.edu.cn/ee/textbook">
b.名称空间的继承性
名称空间具有继承性,也就是说,如果不明确声明子元素的名称空间,子元素将继承父元素的名称空间声明。但要注意的是,在默认声明的名称空间范围内,所有的元素及其子元素不加前缀,而在显示声明的名称空间范围内,所有的元素及其子元素必须加前缀。
如:
<?xml version="1.0" encoding="gb2312"?>
<book xmlns="http://bestbook.jmu.edu.cn/cs/textbook" xmlns:bo=" http://cheapbook.jmu.edu.cn/ee/textbook">
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<price>19.7</price>
</bookinfo>
<bo:publish>
<bo:publisher>高等教育出版社</bo:publisher>
<bo:ISBN>7-04-014768-8</bo:ISBN>
<bo:pubdate>2004.6</bo:pubdate>
</bo:publish>
</book>
2 、名称空间的范畴
名称空间的范畴就是名称空间起作用的范围。而范围就是声明该名称空间的元素及该元素中所有的子元素,除非是在该元素的某一个子元素上又声明了相同的名称空间。
如:
<book:bookinfo xmlns:book="http://book.jmu.edu.cn/it/textbook">
<title>计算机导论</title>
<author>丁跃潮等</author>
<book:publish xmlns:book="http://bestbook.jmu.edu.cn/cs/textbook">
<book:publisher>高等教育出版社</book:publisher>
<book:ISBN>7-04-014768-8</book:ISBN>
<book:pubdate>2004.6</book:pubdate>
</book:publish>
<book:price>19.7</book:price>
</book:bookinfo>
上面的程序当中,用了同名的两个名称空间。第一个名称空间的作用范围是除了<publish>标记块的整个文档内容,属于http://book.jmu.edu.cn/it/textbook名称空间。因为<publish>标记块的内容中使用的名称空间为http://bestbook.jmu.edu.cn/cs/textbook,它是一个独立的区域,第一个名称空间的作用范围要去除该区域。
六、DTD
定义了文档的逻辑结构,规定了文档中所使用的元素、实体、元素的属性、元素与实体之间的关系。
1、作用
(1) 使用DTD可以提供一种统一的格式。
(2) 使用DTD可以保证数据交流和共享的顺利进行。
(3) DTD使用户能够不依赖具体的数据就知道文档的逻辑结构。
(4) 使用DTD可以验证数据的有效性。
2、DTD元素
2.1 元素的基本类型
简单型具有文本数据,即可析字符数据,该类型也称为上下文中的“#PCADTA”;
复合型可以包含其他元素和文本数据。
a、简单型
用“#PCDATA”规范了的元素不能再包含子元素。
“#PCDATA”的声明格式:<!ELEMENT Element_Name (#PCDATA )>
如:
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publisher,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publisher>高等教育出版社</publisher>
<price>19.7</price>
</bookinfo>
b.复合型元素
复合型元素与简单型元素相对,复合型元素可包含其他元素。
如:
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768-8</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
2.2 元素的声明
a. 元素声明的基本语法
元素的声明格式:
<ELEMENT Element_Name Element_Defination>
其中,Element_Name为声明的元素名称,Element_Defination为元素内容格式的定义。
合法的元素声明语句如:
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT publisher (#PCDATA)>
b.空元素的声明
<ELEMENT Element_Name EMPTY>
例如下面的语句:
<ELEMENT hr EMPTY>
C.不限定元素内容的声明
ANY是DTD中使用很频繁的一个关键字,特别是对于文档根元素的声明。在定义一个DTD文档时通常很难准确地确定一个元素是否具有子元素的情况,此时一般的做法是指定该元素的子元素为ANY型(表示可以是任意的元素),这样在它之中可以包含任何数据、任何声明的子元素及其数据和子元素的组合。
ANY元素的声明格式:<!ELEMENT Element_Name ANY>
如: <!ELEMENT person ANY>
d.子元素列表的设定
在XML中有一种针对复合元素的最为严格的设定方法,称为子元素列表的设定。这种方式下,元素都拥有哪些子元素、每个子元素出现的次数和位置都有明确的规定,在具体文档实现时,必须严格执行。子元素列表的设定语法如下:
<!ELEMENT Element_Name(Child_Element1, Child_Element2,…)>
其中“(Child_Element1, Child_Element2,…)”部分为Element_Name所拥有的子元素列表。
如:
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768-8</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
e.可选择的子元素
有些时候,需要在两个或多个互斥的元素中进行选择。即多选一的情况,如一个人的性别可以是男或女,两者中只能有一种情况。DTD有专门的语法来处理这种情况,其语法格式如下:
<!ELEMENT Element_Name(Child_Element1|Child_Element2|……)>
其中,“(Child_Element1|Child_Element2|…)”部分为选择性元素组合,具体使用时必须要在这个列表中选择其一。
如:
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher|ISBN|pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
</publish>
<price>19.7</price>
</bookinfo>
f.元素出现次数的控制
(1) 一个元素可能出现一次,也可能不出现。这时可通过在元素名后面加上一个“?”来实现。
(2) 一个元素可能不出现,也可能出现多次。这时可通过在元素名后面加上一个“*”来实现。
(3) 一个元素可能出现一次,也可能出现多次,但至少也要出现一次。这时可通过在元素名后面加上一个“+”来实现。
h.元素组
在声明复合型元素的时候,可以使用括号将其部分子元素组合在一起,成为一个元素组,该元素组在特性上与普通元素没什么区别,可以对其使用“?”、“*”、“+”等控制字符。
如:
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo ((title,author,price)+)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<price>19.7</price>
<title>三国演义</title>
<author>罗贯中</author>
<price>50.0</price>
</bookinfo>
使用元素组可能不是最好的方案。这时也可以先将准备分组的元素定义为一个复合元素,再在原来的元素中引用刚定义的复合元素,这样文档的结构更清晰
如:
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE bookinfo [
<!ELEMENT maininfo (title, author, price)>
<!ELEMENT bookinfo (booknumb, maininfo+)>
<!ELEMENT booknumb (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<booknumb>2</booknumb>
<maininfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<price>19.7</price>
</maininfo>
<maininfo>
<title>三国演义</title>
<author>罗贯中</author>
<price>50.0</price>
</maininfo>
</bookinfo>
i.混合型元素
还有另一种元素,其内容既可以为字符数据,也可以为子元素,这种元素称为混合型元素。混合型元素的声明格式:
<!ELEMENT Element_Name (#PCDATA|Child_Element1|Child_Element2,…)>
3 DTD属性
3.1 属性的声明
在DTD中,属性的声明格式:
<!ATTLIST Element_name Attribute_name TYPE Default_value>
其中,<!ATTLIST>为属性声明的关键字,Element_name为元素名,Attribute_name为属性名,TYPE是属性类型,Default_value为没有设定属性值时的默认值。
如:
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publisher,price)>
<!ATTLIST bookinfo ISBN CDATA "7-04-014768-8">
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo ISBN="7-04-014768-8">
<title>计算机导论</title>
<author>丁跃潮等</author>
<publisher>高等教育出版社</publisher>
<price>19.7</price>
</bookinfo>
a.在声明属性时有以下需要注意的事项。
(1) 可以多次为一个元素声明其中所包含的属性。如在XML文档中有如下语句:
<bookinfo id="001" bookcategory="文艺" >
</bookinfo>
属性声明可以为
<!ATTLIST bookinfo id CDATA "001">
<!ATTLIST bookinfo bookcategory CDATA "文艺" >
<!ELEMENT bookinfo (#PCDATA)>
(2) 属性的声明在文档中的次序没有严格的要求,可位于与其相连的元素声明之前或之后。如在XML文档中有如下语句:
<bookinfo id="001" bookcategory="文艺" >
</bookinfo>
属性声明可以为
<!ATTLIST bookinfo bookcategory CDATA "文艺" >
<!ATTLIST bookinfo id CDATA "001">
<!ELEMENT bookinfo (#PCDATA)>
(3) 所有元素的属性,都要在各自所对应的标记中声明。如在XML文档中有如下语句:
<bookinfo id="001" bookcategory="文艺" >
</bookinfo>
<publish publisher="高等教育出版社" ISBN="7-04-014768-8">
</publish>
属性声明可以为
<!ATTLIST bookinfo bookcategory CDATA "文艺" >
<!ATTLIST bookinfo id CDATA "001">
<!ELEMENT bookinfo (#PCDATA)>
<!ATTLIST publish publisher CDATA "高等教育出版社" >
<!ATTLIST publish ISBN CDATA "7-04-014768-8">
<!ELEMENT publish (#PCDATA)>
(4) 属性有4种不同类型的默认值,可在属性声明中的Default_value部分指定。
① default:表示使用提供的默认值,default不是一个关键字,它代表一个预设的字符串。
<!ATTLIST bookinfo bookcategory (文艺|自然科学) "文艺" >
此例句表示当在XML文档中省略了对bookinfo元素的bookcategory属性值进行设定时,该属性的默认值就是“文艺”
② #REQUIRED:表示属性值必须指定。
③ #IMPLIED:表示元素的这个属性可用可不用。
④ #FIXED:表示元素的这个属性值是一个固定值,且必须是指定的值。
3.2 属性的类型
在属性的声明中TYPE部分为属性的类型设定,DTD中属性的类型有10种,下面将对这些数据类型进行逐一的介绍。
1. CDATA型
CDATA型表明属性值为不包含“<”和“"”的任意字符串,如果属性值中需要包含“<”和“"”,则可使用特殊字符来代替。
2. Enumerated型
如果属性值并不是任意的字符串,而是在几个可能的值中进行选择,如书籍的“类别”属性,其值可为“文艺”,也可为“自然科学”,而不可能为其他情况时,则可以将书籍的“类别”属性设定为Enumerated型。
如:<!ATTLIST bookinfo bookcategory (文艺|自然科学) "文艺" >
3. ID型
当元素的某个属性值是不能重复时,如书籍的ISBN属性、个人的“身份证号”属性等,要定义这样的属性则需使用属性的ID类型。在一个XML文档中,所有元素的ID类型属性的属性值必须是唯一的,不可重复,另外,一个元素不能有超过一个ID类型的属性。
4. IDREF与IDREFS型
IDREF为Identifier Reference的缩写,IDREF与ID类型属性的关系为子元素与父元素的关系,即IDREF类型属性的值必须是其他元素的ID类型属性的值,且该ID类型属性的值必须在文档的其他地方被设定过。IDREFS类型属性的属性值可有多个,每一个都必须是在文档其他地方被设定了的ID类型属性的值,而这多个属性值之间用空格隔开。
5. ENTITY与ENTITIES型
ENTITY类型的属性提供了把外部二进制形式的文件(如.jpeg、.mp3等)和外部不可解析实体链接到XML文档的功能。因此其属性值也必须为不可解析的链接外部实际数据的通用实体名。ENTITIES类型属性的属性值可由多个不可解析的外部实体名称组成,各实体名称之间使用空格隔开。
6. NMTOKEN与NMTOKENS型
NMTOKEN类型的属性限定属性值是有效的XML名称,这个属性值可以由英文、数字、“.”、 “_”、“-”、“:”等组成,这里有几点需要注意。
(1) 不能包括空格。
(2) 以上字符中除“:”以外,其他字符都可以作为开头字符。
(3) “:”可以出现在中间,但由于它是命名域的关键字符,所以一般不提倡使用。
正因为NMTOKEN类型的属性对于字符的严格要求,使得它在一些常用编程语言中,都是合法的数据,这就为这些编程语言对XML文档数据的操作打下了良好的基础。
NMTOKENS类型的属性具有与NMTOKEN属性相近的形式。这种类型的属性可以使如下情况合法——属性由若干XML名称组成,彼此间由空格隔开。通常可为使用NMTOKEN属性相同的理由而使用NMTOKENS属性,但仅仅在需要多个名字的时候。
7. NOTATION型
XML文档中引入了外部不可解析的实体后,解析器无法解析这些二进制文件,这时,就可以使用NOTATION类型的属性为这些二进制文件指定与其对应的应用软件以对其进行处理。
4 、DTD中的实体
4.1 实体的概念
实体是包含了文档片段的虚拟存储单元,可用来存储XML声明、DTD、其他形式的文本及二进制数据等。简单来讲就是一段代码或数据的代称,这个代称即为实体的名字。
4.2 实体的分类
按照实体的具体内容来分类,实体可分为可解析与不可解析两类。可解析实体的具体内容为简单的字符、数字、文本块,而不可解析实体的具体内容则为图片、声音等二进制文件。
按照逻辑存储来分类,实体可分为内部实体与外部实体两类。内部实体的内容是在文档内部设定的;而外部实体则是一个外部独立的物理存储对象,如某个外部文件。
按照使用的范围来分类,实体可分为一般实体与参数实体两类。一般实体都用来构成文档的具体内容,可出现在XML文档中,也可出现在DTD中;而参数实体只能出现在DTD中,不能出现在XML文档中。
1. 内部一般实体
内部一般实体就是在文档实体内部定义和使用的实体,其内容通常是一段文本字符。这种实体要在DTD中通过DTD语句的定义,可以在XML文档中使用,也可在DTD中使用。其定义的语法格式如:<!ENTITY Eentity_name "Replacement" >
其中,<!ENTITY>为关键字,Eentity_name为实体名称,Replacement为实体所代替的文本内容。
当内部一般实体在DTD中引用时,有以下几方面需注意。
(1) 不能在元素及属性的声明中引用内部一般实体
(2) 在语句中不能出现循环,
2. 外部一般实体
所谓外部一般实体就是在文档实体以外定义的,要通过一个URL才能引用到的实体。外部一般实体为独立的文件,可被多个文档所引用。正因为每一个完整的XML文档都是一个合法的实体,所以XML通过对外部一般实体的引用,可以在一个XML文档中嵌入另一个XML文档,或者将多个文档组合成一个文档。其定义的语法格式如下:
<!ENTITY Eentity_name "URL" >
其中,URL为引用的外部实体的URL地址。引用外部一般实体也与引用内部一般实体的方法一样:
&Eentity_name;
在引用外部一般实体时,有以下几方面需注意。
(1) 因为在一个文档中需引用某些外部文件,所以该文档声明中的standalone属性不再是默认值yes,而应该为no。
(2) 作为外部一般实体的文档,若使用的是XML的默认字符集即UTF-8或UNICODE,则可以在文档头部不进行XML声明,否则,必须有XML声明,且声明时,一定要说明encoding属性。