960 likes | 1.11k Views
第五章 XML 标注语言. 通过本章的学习,要求: 1 .了解 Schema 语言的基本结构; 2 .掌握 XML 的基本语法; 3 .学会使用 XML 编写程序。. 第一节 XML 的基本语法. 一、 XML 的出现及发展前景 XML 是 Extensible Markup Language ( eXtensible Markup Language 的缩写,意为可扩展的标记语言)。 XML 的最大优点在于它的数据存储格式不受显示格式的制约。一般来说,一篇文档包括三个要素 : 数据、结构以及显示方式。
E N D
第五章 XML标注语言 通过本章的学习,要求: 1.了解Schema语言的基本结构; 2.掌握XML的基本语法; 3.学会使用XML编写程序。
第一节 XML的基本语法 一、XML的出现及发展前景 XML是Extensible Markup Language(eXtensible Markup Language的缩写,意为可扩展的标记语言)。 XML的最大优点在于它的数据存储格式不受显示格式的制约。一般来说,一篇文档包括三个要素: 数据、结构以及显示方式。 这样使得它在政府、金融、证券、邮电、保险、税务、司法、出版以及电子商务等方面得到了广泛的应用。
1、 HTML的不足点 1.难以扩展 2.交互性差 3.语义性差 4.缺乏弹性 2、要使XML文件也能像HTML文件一样在浏览器中被显示出来,必须要有另一个文件来告诉浏览器如何将该XML文件显示出来,该文件称为样式表 1.层叠样式表(CSS) 2.可扩展的样式表语言(XSL) 3.可扩展的链接语言(XLL)
XML的应用可分为四大类 (1)应用于当客户需要与不同的数据源进行交互时。 (2)应用于需要将大量运算负荷分布到客户端时。 XML的自解释性使客户端在收到数据的同时也能理解数据的逻辑结构与含义,从而使广泛、通用的分布式计算成为可能。 (3)应用于需要将同一数据以不同的面貌展现给不同的用户 (4)应用于网络代理对所取得的信息进行编辑、增减以适应个人用户的需要。
二、XML文件的结构 1. XMl文档结构 <?xml version="1.0" encoding="GB2312"?> <!--这是有关通讯录的XML文档?--> <通讯录> <人员> <姓名>王小明</姓名> <职称>教授</职称> <学院>信息学院</学院> <电话>6258113</电话> </人员> </通讯录>
1. XMl文档结构 XML文档包含由XML标记和字符数据组成的文本。它是一个有固定长度的有序字节的集合,并遵守特定的约束。 1)、XML由称为“实体”的存储单元组成,每个实体包含文本或者二进制数据,两者不能同时存在。 2)、XML文档是文本。文本由字符组成,字符是字母、数字、标点符号、空格、制表符号或类似的符号。
从整体划分,XML文件分为文件头和文件本体 1.文件头(prolog) 必要的文件头:如例中文件头。其中 1、<? 表示该行是一个指令;xml用来标明该文件是xml文件; 2、version=”0.1”标明该文件是使用XML1.0版本规范; 3、encoding=”gb2312”标明文字编码的属性是使用中文GB2312字符编码。 4、standalone=”yes”表明该XML文件是否和一个其他声明文件配套使用。 2.文件本体 文件本体是用来存放XML文件中的内容信息,所有XML文件中可以被应用程序使用的信息都会放在该区。文件本体是由开始的<通讯录>和</通讯录>所组成。
3.注释 XML的注释与HTML的注释很相似,它们以<!--开始,以-->结束。介于<!--和-->之间的全部数据均被XML处理器忽略,就像它们根本不存在一样。注释用于提醒自己或临时标注出文档中不完善的部分。例如: <?xml version="1.0" standalone="yes"?> <!—注释信息—> 在使用注释时注意以下几点: (1)注释不能出现在XML声明之前,XML声明必须是文档最前面的部分。 (2)注释不能放在标记中。 (3)注释可以包围和隐藏标记。 (4)两个连字符号(--)除了作为注释起始和结束标记的一部分外,不能出现在该注释中。
4.标记 1)、标记名必须以字母或下划线(_)开始,名称中后续字符可以包含字母、数字、下划线、连字符和句号。其中不能含有空格(经常用下划线替代空格)。 如: <name>、<姓名>、<first_name>、<_8734> <First Name>、<.7658>、<311com> 2)、结束标记与起始标记同名,只是在起始尖括号后加了一个/ <name>…… </name>、 <姓名>…… </姓名> 3)、 XML名称是大小写敏感的。在HTML中的<P>和<p>是同一个标记,</p>可以结束一个<P>标记,但在XML中却不行 4)、XML中标记必须成对出现。
5. 实体引用 实体引用是指分析文档时会被字符数据取代的置标
6. CDATA CDATA段以<![CDATA[ 开始并以 ]]>结束 如果希望将一段XML文件中的信息,包括文字与标记都被解析器当作纯文字来解释,而不要解析该段信息中的任何标记,并将这段信息原封不动地传给应用程序的话,使用CDATA标记可以做到。 XML代码: <?xml version="1.0" standalone="yes"?> <Hello> Welcome to XML! </ Hello > 用实体引用的方法,将表示如下: <?xml version="1.0" standalone="yes"?> < Hello > Welcome to XML! </ Hello >
如果尝试用一个CDATA段来表示上面的代码。 CDATA段以<![CDATA[ 开始并以 ]]>结束 例如: <![CDATA[ <?xml version="1.0" standalone="yes"?> <Hello> Welcome to XML! </ Hello > ]]>
7.属性 起始标记和空标记可以随意地包含属性。属性是用等号(=)分隔开的名称-数值对。 (1)属性名 属性名必须以字母或下划线(_)开始,名称中后续字符可以包含字母、数字、下划线、连字符和句号。其中不能含有空格(经常用下划线替代空格)。 1)、 同一个标记不能有两个同名的属性。 例如,下面的例子是不合法的: < Hello LANGUAGE="English" LANGUAGE="Chinese"/> 2)、属性名是区分大小写的。 LANGUAGE属性与Language或者language属性不是同一个属性,因此以下例子是合法的: < Hello LANGUAGE ="English" Languagee="Chinese"/>
(2)属性值 属性值也是字符串。如下面所示的LENGTH属性,即使字符串表示的是一个数,但还是两个字符5和8,不是十进制数的58。 <RULE LENGTH="58"/> 与属性名不同,对属性值包含的内容没有任何限制。属性值可以包含空格,可以以一个数字或任何标点符号(有时单括号和双括号除外)开头。
三、结构完整的XML XML文档为了保持结构完整必须遵循一定的规则。事实上,XML规范严格禁止XML句法分析器分析和解释结构欠妥的文档。 为了使一个文档结构完整,XML文档中的所有置标和字符数据必须遵守前面所给出的规则。这些规则总结如下: (1)文档的开始必须是XML声明。 (2)含有数据的元素必须有起始标记和结束标记。 (3)不含数据并且仅使用一个标记的元素必须以/>结束。 (4)文档只能包含一个能够包含全部其他元素的元素。 (5)元素只能嵌套不能重叠。 (6)属性值必须加引号。 (7)字符<和&只能用于起始标记和实体引用。 (8)出现的实体引用只有&、<、>、'和"。
(1)文档的开始必须是XML声明。 <?Xml version=“1.0” standalone=“yes”?> <personDATA> <name>chenming</name> <birth>02/21/1970</birth> <email>chenming@hainu.edu.cn</email> </personDATA> 以下宣告是错误的: <!—chenming’s person data--> <?xml standlone=“yes”?>
(2)含有数据的元素必须有起始标记和结束标记。(2)含有数据的元素必须有起始标记和结束标记。 <?xml version="1.0" standalone="yes"?> <PersonDATA> <name>wanghong</name> <birth>12/21/1969</birth> <email> wanghong @hainu.edu.cn</email> <occupation>teacher </PersonDATA>
(4)文档只能包含一个能够包含全部其他元素的元素。(4)文档只能包含一个能够包含全部其他元素的元素。 <?xml version="1.0" standalone="yes"?> <PersonDATA> <name>chenming</name> <birth>02/21/1970<birth> <email> chenming @hainu.edu.cn</email> </PersonDATA> <PersonDATA> <name>wanghong</name> <birth>12/21/1969</birth> <email> wanghong @hainu.edu.cn</email> <occupation>teacher </PersonDATA>
(5)元素只能嵌套不能重叠。 <姓名>陈明<职称>教授</姓名></职称> (6)属性值必须加引号。 <?xml version=“1.0” standalone=“yes”?> <PersonDATA ID=“460100631031159”> (7)英文字母的大小写是有差异的 <City><CITY><city>
四、XML文件实例 【例题5.1】 1. <?xml version="1.0" encoding=”GB2312”> 2. <!—以下为一个用XML描述学生的实例--> 3. <学生> <姓名>王芳</姓名> <性别>女</性别> <专业>电子商务</专业> <联系地址> <地址>文二路138号</地址> <邮编>310012</邮编> <E_mail>wangfang@163.com</ E_mail > <电话>13808264536</电话> </联系地址> </学生>
五.名字空间 名字空间(Namespaces)在XML中非常重要。 名字空间标准提供了一个很好的方法,即在元素名和属性名的前面先声明它的名域,为了唯一地区分,XML采用URL(Uniform Resource identifier统一资源标识符)作为名域的唯一标识,从而来区分相同的标识名。 1、Namespaces同样需要在XML文档的开头部分声明,声明的语法如下: <document xmlns:yourname='URL'> 其中yourname是由你定义的namespaces的名称,URL就是名字空间的网址。
假设上面一个"学生"文档来自http://www.hzstudent.com,另一个"学生"文档来自http://www.forstudent.com我们就可以分别声明为:假设上面一个"学生"文档来自http://www.hzstudent.com,另一个"学生"文档来自http://www.forstudent.com我们就可以分别声明为: <document xmlns:hzstudent='http://www. hzstudent.com'> <document xmlns:forstudent='http://www. forstudent.com'> 然后在后面的引用时,我们就可以使用前面定义好的名字空间,比如: < hzstudent:学生姓名>王芳</ hzstudent:学生姓名> < forstudent:学生姓名>Mike</ forstudent:学生姓名> 这样就将这两个学生文档区分开来。注意的是:设置URL并不是说这个标识真的要到那个网址去读取,仅仅作为一种区别的标志而已。
第二节 文档类型定义 一、文档类型定义 • DTD代表文档类型定义。一项文档类型定义应规定元素清单、属性、标记、文档中的实体及其相互关系。 • DTD可以包括在它描述文档的文件中,或者与外部的URL相链接。这些外部DTD可以被不同文档和网站所共享。 • DTD有助于不同的人们和程序互相阅读文件。 • DTD可以在没有实际数据的情况下展现出页面上的不同元素是如何安排的。 • 用DTD还可以做更多的事。
二、文档类型声明 • 文档类型声明出现在文档的序言部分,处在XML声明之后和基本元素之前,它可能包括文档类型定义或是标识文档类型定义所在文档的URL。 • 文档类型声明指定了文档使用的DTD。 • 在有些情况下文档类型定义有内外两个子集,则文档类型声明可能同时包括以上两种情况。
不带文档类型的Hello XML <?xml version="1.0" standalone="yes"?> <Hello> Welcome to XML! </Hello > 带有DTD的Hello XML <?xmlversion="1.0" standalone="yes"?> <!DOCTYPE Hello [ <!ELEMENT Hello (#PCDATA)>]> < Hello > Welcome to XML! </ Hello > 1、<?xml version=“1.0” standalone=“yes”?>是XML声明; 2、<!DOCTYPE Hello [ <!ELEMENT Hello (#PCDATA)> ]>是文档类型声明; 3、<!ELEMENT Hello (#PCDATA)>是文档类型定义; 4、< Hello > Welcome to XML! </ Hello >是文档或基本元素。
在有些情况下文档类型定义有内外两个子集,则文档类型声明可能同时包括以上两种情况。在有些情况下文档类型定义有内外两个子集,则文档类型声明可能同时包括以上两种情况。 1、带DTD的hello.xml <?xml version="1.0" standalone="yes"?> <!DOCTYPE REGARD [ <!ELEMENT REGARD (#PCDATA)> ]> <REGARD> HelloXML! </REGARD>
带有DTD和样式单的Hello.xml <?xml version="1.0" standalone="yes"?> <?xml-stylesheettype="text/css"href="regard.css"?> <!DOCTYPE REGARD[ <!ELEMENT REGARD (#PCDATA)>]> <REGARD> HelloXML! </REGARD>
根据DTD的合法性检验 1、合法文档必须符合DTD指定的约束条件。而且,它的基本元素必须是在文档类型声明中指明的。 不符合DTD规则的不合法的Hello XML <?xml version="1.0" standalone="yes"?> <?xml-stylesheet type="text/css" href="regard.css"?> <!DOCTYPE REGARD[ <!ELEMENT REGARD (#PCDATA)> ]> <foo> Hello XML! </foo>
合法文档不允许使用任意的标记。使用的任何标记都要在DTD内声明。而且,必须以DTD允许的方式使用。 • 不是所有的文档都必须合法,也不是所有的语法分析程序都检查文档的合法性。事实上,多数Web浏览器都不检查文档的合法性。 • 进行合法性检查的语法分析程序读取DTD并检查文档是否合乎DTD指定的规则。如果是正确的,则分析程序将数据传送到XML解析程序(如Web浏览器和数据库)。如果分析程序发现错误,它将报告出错。 • 在Web上可找到几十种不同的进行合法性检查的语法分析程序,其中多数是免费的。
列出元素 • 要为一个文档创建适当的DTD,第一步是了解用DTD中定义的元素编码的信息结构。 • 所编写的DTD要为每个元素作元素声明。每一元素声明列出元素名和它的子元素。 • 需要编写DTD结构完整的XML文档 list\1.doc • 学生成绩统计中的元素 list\2.doc
三、建立XML DTD DTD分为内部和外部两种类型, 内部DTD作为DOCTYPE声明的一部分被直接书写在XML文档中。 外部DTD被书写为一个单独的文件,该文件从XML文档的DOCTYPE声明中参照。
在一个DTD中,可以建立4种类型的声明。 (1)ELEMENT:定义XML文档中所涉及的“内容”,如:学生、客户、图书、产品等; (2)ATTLIST:定义属性,并指出这些属性对某个指定元素的可能取值,如:学生的姓名为“王芳”,某本图书的名称为“电子商务技术基础”; (3)ENTITY:定义一个代表所插入的长字符串的实体名称; (4)NOTATION:为非XML数据定义一个名称,并将它与处理该数据的适当应用程序联系起来。 在以上4种类型的声明中,我们通常只使用元素和属性。
1.连接内部DTD 使用内部DTD的方法是在XML文件的序言部分加入一个DTD描述。以下为一个包含DTD的XML文件的结构: <?xml version="1.0" encoding=“GB2312” standalone="yes"?> <!DOCTYPE 根元素名 [ <!ELEMENT 元素描述> ]> 文件体…… 例:list\3.doc
2.连接外部DTD 为了引用一个外部DTD,必须修改XML声明和DOCTYPE声明。XML声明中必须说明这个文件不是自成一体的,即standalone属性的属性值不再是“yes”,在DOCTYPE声明中,加入SYSTEM属性。 <?xml version="1.0" encoding=“GB2312” standalone="no"?> <!DOCTYPE 根元素名 SYSTEM “外部DTD文件的URL”> URL是一个绝对路径,同时也可以是相对路径,我们将上例中的DTD放到一个单独的文件(student.dtd)中: 例:list\4.doc
元素声明 1、DTD中首先要标识基本元素。 如:<!DOCTYPE 学生 [ ]> 2、若要基本标记是学生中包含其它内容,可通过下列一行代码来实现: 如:<!ELEMENT学生ANY> 所有的元素类型声明都以<!ELEMENT(区分大小写)开头而以>结束。其中包括声明的元素名称如:学生,后接内容规格。
元素声明 • ANY 关键词ANY(也要区分大小写)表明所有可能的元素以及可析的字符数据都可以是学生元素的子元素。 <?xml version="1.0" encoding=“GB2312” standalone="yes"?> <!DOCTYPE学生[ <!ELEMENT学生ANY> ]> <!ELEMENT EDUCATION ANY>
但是,虽然元素“学生”被定义为“ANY”,即可以包含其它元素,但由于DTD中除了“学生”元素外,没有定义任何其它元素,也没有其它元素作为其子元素,因此,下面的XML文件是不能被语法分析器所接受的。但是,虽然元素“学生”被定义为“ANY”,即可以包含其它元素,但由于DTD中除了“学生”元素外,没有定义任何其它元素,也没有其它元素作为其子元素,因此,下面的XML文件是不能被语法分析器所接受的。 <?xml version="1.0" encoding=“GB2312” standalone="yes"?> <!DOCTYPE学生[ <!ELEMENT学生ANY>]> <学生> <姓名>王芳</姓名> <性别>女</性别> <专业>电子商务</专业> <联系地址> <地址>文二路138号</地址> <邮编>310012</邮编> <E_mail>wangfang@163.com</ E_mail > <电话>13808264536</电话> </联系地址> </学生>
为了使元素“学生”中还可以包含其他元素,从而使前面的文件“有效”,还需要定义其他元素。为了使元素“学生”中还可以包含其他元素,从而使前面的文件“有效”,还需要定义其他元素。 <?xml version="1.0" encoding=“GB2312” > <!ELEMENT学生(姓名, 性别, 专业, 联系地址+)> <!ELEMENT姓名(#PCDATA)> <!ELEMENT性别(#PCDATA)> <!ELEMENT专业(#PCDATA)> <!ELEMENT联系地址(地址, 邮编, E_mail, 电话)> <!ELEMENT地址(#PCDATA)> <!ELEMENT邮编(#PCDATA)> <!ELEMENT E_mail(#PCDATA)> <!ELEMENT电话(#PCDATA)> ]>
<!ELEMENT 姓名 (#PCDATA)> • #PCDATA 该声明说明“姓名”只能包含可析的字符数据,即非标记文本,但它不能包含自己的子元素。
例如1: <?xml version="1.0" standalone="yes"?> <!DOCTYPE EDUCATION [ <!ELEMENT YEAR (#PCDATA)> <!ELEMENT EDUCATIONANY (#PCDATA)> ]> <EDUCATION> <YEAR>1999</YEAR> </EDUCATION>
例如2: <?xml version ="1.0" standalone="yes"?> <!DOCTYPE EDUCATION [ <!ELEMENT YEAR (#PCDATA)> <!ELEMENT EDUCATION ANY (#PCDATA)> ]> <EDUCATION> <YEAR>1999</YEAR> 教育 </EDUCATION>
例如3: <?xml version="1.0" standalone="yes"?> <?xml-stylesheet type="text/css"href=" education.css"?> <!DOCTYPE EDUCATION [ <!ELEMENT YEAR (#PCDATA)> <!ELEMENT EDUCATION ANY (#PCDATA)> ]> <EDUCATION> <YEAR>1999</YEAR> 教育统计 </EDUCATION>
元素声明(续) • 子元素列表 有两个KIND子元素的EDUCATION元素 list\4-8.doc
元素声明(续) 3.元素的内容 元素的内容分为以下几种形式: (1)#PCDATA:包含可解析的字符数据,即非标记文本。 (2)EMPTY内容:该类型标示元素不允许有内容,而只能用属性标示。 (3)ANY内容:标示元素可以出现任何内容。通常根元素使用ANY,尤其是对未结构化的文档,但对多数其他元素则应避免使用ANY。 (4)子元素内容:只能出现在元素类型声明中规定的子元素。
(5)混合内容: 指可以有字符数据,或字符数据和内容说明中出现的子元素的混合体。使得元素中即可能包含子元素,也可能包含纯文本。 如下例: <!ELEMENT学生(姓名, 性别, 专业, #PCDATA)> <学生> <姓名>王芳</姓名> <性别>女</性别> <专业>电子商务</专业> 学生王芳的联系地址 </学生>
元字符 含义 + 出现一次或多次 * 出现零次或多次 ? 可选,不出现或出现一次 ( ) 一组要共同匹配的表达式 | OR,或 , AND,要求严格遵从顺序要求 元素A元素B元素C 元素列表,无需遵从顺序要求 子元素的定义 正则表达式中可能出现的元字符及含义