870 likes | 1.04k Views
第二章 XML 的语法基础. 2.1 XML 的语法基础 2.2 XML 的文档结构 2.3 名称空间 2.4 语言标识. 2.1 XML 的语法基础. 为了便于讨论,先给出一个 XML 文档的样本,通过分析,逐渐展开。 <?xml version="1.0" encoding="GB2312"?> <booklist> <book isbn="7-04-008653-0"> <name> 数据通信与计算机网络 </name> <author> 王震江 </author> <press> 高等教育 </press>
E N D
第二章 XML的语法基础 2.1 XML的语法基础 2.2 XML的文档结构 2.3 名称空间 2.4 语言标识
2.1 XML的语法基础 为了便于讨论,先给出一个XML文档的样本,通过分析,逐渐展开。 <?xml version="1.0" encoding="GB2312"?> <booklist> <book isbn="7-04-008653-0"> <name>数据通信与计算机网络</name> <author>王震江</author> <press>高等教育</press> <pubdate>2000.7</pubdate> <price>23.9</price> </book> <book isbn="7-113-05310-6/TP.956"> <name>操作系统</name> <author>薛智文</author> <press>中国铁道</press> <pubdate>2003.6</pubdate> <price>32.00</price> </book> </booklist>
2.1 XML的语法基础 这是一个描述图书信息的XML文档。根元素是booklist,下面有若干个子元素book,在book中有表示具体数据的子元素name、author、press、pubdate、price 五个元素。另外,book元素还包含一个附属于它的属性isbn。
2.1.1结构良好性 结构良好性(well-formedness)是XML规范中特别强调的重要概念,XML文档的书写必须满足“结构良好(well-formed)”的原则。所谓的结构良好的必要条件是: (1) 它总体是一个XML文档。 (2)它满足所有在XML1.0规范中提出的关于结构良好性的约束。
2.1.1结构良好性 (3)在XML文档中被直接或间接引用的每一个实体也是结构良好的。 其中关于XML文档的定义如下: ◆它包含至少一个元素。 ◆有一个叫做根或文档的元素,它不能作为任何其他元素的内容出现。
2.1.1 结构良好性 是什么原因使W3C对结构良好性如此重视,以至于在XML1.0规范的开篇之处就讨论结构良好的问题?这是因为,过去几年来,WWW在Internet上取得了巨大成就,但是,用于描写WWW的基本编程语言是HTML。相当数量的人在书写HTML时的不规范性和随意性,使得HTML文件的可读性大大降低,甚至出现混乱的局面,如写标签时不写结束标签,写属性值
2.1.1 结构良好性 不用引号(”或’),不区分大小写等。W3C的专家们期望XML规范是下一代的WWW的主要编程语言和标准,他们不希望几年后,XML的使用也象HTML一样出现任何问题。 所以,把结构良好性写在了XML1.0规范的重要位置,用以强调XML文档中的所有词素和语法必须是定义明确的,结构良好的。
2.1.2XML声明 在例2.1中的第一行出现的<?xml version=”1.0”?>是XML规范规定的所有XML文件必须具有的一行,称为XML声明,并规定,这个声明必须写在每一个XML文档的第一行,以标记这是一个XML文档,否则它就不是一个XML文档,并依此来区别于其他文档。 1、XML声明 XML声明的格式为: <?xml version=”1.0” encoding=”” standalone=””?>
2.1.2XML声明 一般情况下,上面格式中可以省去encoding和standalone。 XML的解析程序可以正确地得到上面文本的正确结果。对于其它的字符集合,必须事先声明。 2、XML的字符选择 XML文档的默认字符系统是UTF-8,与传统的ACSII字符集一致,如果处理的是英文字符,这已经满足了需要。此时XML文档可以使用英文字符。如果使用其它国家的代码,如拉丁文字,中文、朝鲜文、日文,则必须使用Unicode字符集来定义
2.1.2XML声明 XML文档将要使用的特定字符。 为了解决不同语言标准互不兼容的问题,Unicode为每一个字符提供一个唯一的编号。 Unicode用16位二进制代码对字符进行编码,这样可以产生65536个可能的不同字符。 ASCII字符集在Unicode中只占很小的一点。目前常见的字符集有UTF-8、UTF-16、Windows-1252、ISO-8859-n、ISO-10646-UCS-2。下面是用几种不同的字符集对XML文档进行定义和改写例2.2后的代码。
2.1.2XML声明 【例2.3】字符集为ISO-8859-1的XML文档。 <?xml version="1.0" encoding="ISO-8859-1"?> <hello>Good morning!</hello> 【例2.4】字符集为ISO-8859-1的XML文档。 <?xml version="1.0" encoding="ISO-8859-1"?> <hello>早上好!</hello> 要想使用其他字符集,可以如法炮制。读者可以编辑这些程序,然后用IE浏览器浏览,查看其结果如何?以理解XML的代码集合的正确使用。如果要使用中文字符集,必须有
2.1.2XML声明 encoding = "GB2312"声明。因为,GB2312中列出了基本的汉字交换标准。如下的字符声明。 【例2.5】字符集为GB2312的XML文档。 <?xml version="1.0" encoding="GB2312"?> <hello>你好,世界!</hello> 请读者用浏览器浏览,看看结果怎样。如果删除encoding = “GB2312”,情况又会怎样?读者可以自己试一试。 3、standalone属性 独立文档声明(standalone),以XML声明的成分出现,告
2.1.2XML声明 诉文档是否存在一个外部的文档实体或参数实体。即,在XML声明中的standalone 属性用来定义是否存在外部的标记声明。如果不存在外部的标记声明,standalone 取值为“yes”。如果可能存在这类外部标记声明,则取值为“no”。如果不存在外部的标记声明,standalone声明没有意义。如果存在外部标记声明而又没有写明standalone的取值,则系统取值为“no”。 任何有standalone=”no”声明的XML文档,可以在算法上转变成可独立(standalone)文档,这种文档对某些网络发布应用可能是需要的。
2.1.3 XML的元素 1.元素标记 元素标记简称标记(tag)。XML的标记与HTML中的标记一样,所不同的是HTML的标记由HTML规范规定,XML的标记由用户自己规定。 在XML中,标记分为开始标记和结束标记。开始标记由小于符号“<”和“>”大于符号把标记名括起来。结束标记是在开始标记的小于符号“<”后紧跟符号“/”。如上例中的<book>,<name>是开始标记,它们的结束标记分别是</book>,</name>。
2.1.3 XML的元素 在开始标记和结束标记中包含的任意字符串称为元素值。除了包含元素值以外,在开始标记和结束标记还可以包含下一级子元素。如,<name>数据通信与计算机网络</name>定义了一个图书书名的元素,元素值是“数据通信与计算机网络”。而<book>……</book>包含的就是多个下一级子元素。 标记的一般命名规则要求具有确切含义,如booklist定义了图书列表,author定义了作者元素,press定义了出版社元素等。除此之外,还有如下要求: ①首字符是英文、汉字字符或其他字符,后跟数字或其他符号。
2.1.3 XML的元素 ②严格区分英文字母的大小写。 ③不能使用XML或xml作为元素名称。 ④不能独立使用数字作为元素名。 ⑤在元素名中可以使用“_”、“.”等符号。 ⑥不能使用“<、>、?、/、&、+、*”等符号作为元素名。 为了便于理解上述定义,下面是一些合法和非法的标记名示例。
2.1.3 XML的元素 不合法的元素标记: <123></123> 数字开头 <Name></name> 大小写不匹配 <person></PERSON> 大小写不匹配 <STUDENT?NO></STUDENT?NO> 使用非法字符 <press>高等教育出版社<press> 没有结束标记
2.1.3 XML的元素 合法的元素标记: <x123></x123> <student_name></student_name> <Name></Name> <person></person> <student_no></student_no> <学号></学号> <姓名></姓名>
2.1.3 XML的元素 2、元素嵌套 每个XML文档必须有一个且只能有一个称之为“根”(root)的元素,如例2.1中的<booklist>。其他元素必须写在一对根元素<booklist>和</booklist>之间。 元素可以包含值,可以为空值,还可以有下层子元素。 某元素的子元素写在该元素的开始标记之后和结束标记之前,如每一个<book>元素下的所有子元素写在<book>之后和</book>之前,这种结构称为元素嵌套。
2.1.3 XML的元素 元素嵌套子元素,子元素可以嵌套下一级子元素。这种嵌套必须严格。图2.1是几种嵌套情况,在(a)中的<a>元素有两个平级子元素<b>、<c>,<b>、<c>元素书写正确。(b)中<a>元素有两级子元素<b>、<c>,其中<c>又是<b>的子元素,<c>元素书写正确。(c)中<a>元素有<b>、<c>,但<b>、<c>元素交叉嵌套,因此错误。(d)中<a>和<b>是同级元素,但交叉嵌套,因此错误。
2.1.3 XML的元素 <a> <b></b> <c></c> </a> (a) <a> <b> <c></c> </b> </a> (b) <a> <b> <c></b> </c> </a> (c) <a> <b> </a> </b> (d) 图2.1 上述嵌套中(a)(b)正确,(c)(d)错误。
2.1.3 XML的元素 3、空元素 当元素标记之间没有元素值时,这样的元素叫空元素。如图2.1(a)中的元素<b>、<c>是空元素,但是<a>不是空元素,因为它包含了两个子元素,虽然其子元素为空。 当元素为空值时,其表示可以简化成用“<”和“/>”包括元素名。如:<name></name>简化成<name/>,<phone></phone>可以简写成<phone/>。 对于在XML转换文档中的出现的某些无结束元素的HTML元素,如<img>、<br>、<hr>,为了满足结构良好性,在XML转换
2.1.3 XML的元素 程序中使用时应该写成<img/>、<br/>、<hr/>。这样就保证即可以满足XML的结构良好性要求,又可以在XML应用中使用HMTL中的既定元素。 与HTML一样,XML元素也有属性。为了便于理解XML中的属性,我们先看几个HTML中几个元素的属性。如:<font color=”” face=”” size=””>、<img src=”” width=”” height=”” alt=””> 对于熟悉HTML语法的读者,很容易理解上面两个标签的含义和用法。前者是定义字符的标签,其中color、face、size
2.1.4 属性 都是属性分别定义颜色、字体、字大小。后者定义图形,其中src、width、height、alt也是属性。这说明在HTML中大量使用了属性。 1. 属性的定义 在XML文档中,属性是用来与元素联系起来的一对“名字-值”,属性的定义不能出现在元素的开始标记和空元素标记之外。元素的属 性可以是一个,也可以是多个。当出现多个属性时,每个属性之间用空格分隔。多个属性又叫属性列表,对于一个给定的元素,属性列表是附属于这个元素的属性集合,
2.1.4 属性 可以确定这些属性的类型约束,可以为属性提供默认的属性值。属性和属性值之间用“=”号连接,属性值必须用英文的引号(”或’)括起来。在例2.1中,每个<book>元素中定义了一个isbn的属性,其取值是每本书的isbn号,其形式是isbn=“7-04-008653-0”。 例2.6是关于服装中衬衫的XML文档,在该文档中为元素<price>定义了currency和unit两个属性,currency定义了衬衫价格的货币种类是人民币(RMB),unit定义了衬衫价格的货币单位是元(Yuan)。这样的定义容易使人把price元素与货币种类currency和货币单位unit这两个属性关联起来,使之
2.1.4 属性 成为一个整体。 【例2.6】关于服装的XML文档 <?xml version="1.0" encoding="GB2312"?> <clothes> <shirt> <name>金利来</name> <size>170/92A</size> <price currency="RMB" unit="Yuan">420.00</price> </shirt > </clothes> 在XML文档中,属性和元素之间是没有本质差别,例2.6中价格的属性可以分别设计成独立的元素,这并不违反XML的语
2.1.4 属性 法规则。如例2.7所示。此时currency和unit这两个原来是price元素的属性,现在成为<shirt>的子元素,与price元素形成平级关系,这并不违反XML的语法规则。但是这样做,消除了currency和unit这两个元素跟price元素之间的直接关联关系,可以把它们理解成是与其它元素平级的元素,这与原来的设计意图是矛盾的。另外作为独立元素的unit到底是想表示价格的单位还是衬衫的单位,意义就不明确。所以在设计元素和元素属性时,事先应该仔细考虑。
2.1.4 属性 【例2.7】把例2.6中price 元素的属性写成元素 <?xml version="1.0" encoding="GB2312"?> <clothes> <shirt> <name>金利来</name> <size>170/92A</size> <price>420.00</price> <currency>RMB</currency> <unit>Yuan</unit> </shirt > </clothes>
2.1.4 属性 2、属性类型 XML属性类型有三种:字符串类型、标记化类型和枚举类型。字符串类型可以取任意的文字串作为值。标记化类型有不同的词法和语义约束。有关属性的定义、使用和说明将在第三章DTD和第四章XML Schema中进行。
2.1.5 实体 1、实体概念 XML文档可以包含至少一个存储单元,这些存储单元叫实体,它们全部都有内容且由实体名称来标识(除了文档实体和外部DTD子集外)。每个XML文档有一个叫文档的实体,用来做为XML处理器的起始位置,并可以包含整个XML文档。 实体可以是可解析的和不可解析的。所谓可解析实体是:其内容与替换文本相联系,这个替换文本是XML文档的一个整体部分。所谓不可解析实体的是:它的内容可以是或者不是文本(text),如果是文本,那么不是XML。每一个不可
2.1.5 实体 解析的实体与一个表示法 (notation)联系,由名称标识。除了要求XML处理器把这些用于实体和表示法的标识符应用于应用程序外,XML对不可解析实体的内容没有约束。 2、引入实体的原因 在XML文档中,由于规定使用“<、>、’、”、&”等符号作为XML文本的标记和内容声明的组成部分,我们通常把这些符号叫做XML的保留字。当需要在XML文档数据中写入上述这些字符时,如果不进行转换,解析器将会把它们理解成XML规范定义的含义,而无法实现把这些符号作为元素数据的目的。
2.1.5 实体 如: x<y>z表示x小于y,y大于z x&y表示x与y的连接运算,或表示x和y的逻辑与 x>y?x=0:x=yC程序表达式 在XML文档中表示上述表达式时,由于使用了XML 规范规定的保留字符,在系统解析时就会产生错误,得到错误的信息和字符。为了解决这个问题,XML提供了五种预定义实体,在文档中需要表示这些字符数据时,使用这些预定义实体对这几个保留字进行转义。表2.1所示。
2.1.5 实体 需要实体的另外一个原因是,可以通过实体引用调用事先定义好的内部或者外部实体,使多个XML文档可以访问和调用同一个实体。 3、实体声明 实体类别可以按照引用方式和所处位置这两种方式来分类。按引用方式可以分为一般实体和参数实体,按实体所处的位置可以分为内部实体和外部实体。内部实体和外部实体的具体内容由一般实体和参数实体定义。无论是哪类实体,在使用之前都必须先声明,没有声明的实体的引用被认为是错误的。
2.1.5 实体 如果在XML文档中多次声明了同一个实体,则XML处理器可能发布一个警告。 实体的声明因为其类型不同,方法各有差异,下面分别予以介绍。 (1)一般实体 一般实体的声明格式为: <!ENTITY 实体名实体定义> 其中,前面的“!”和关键词“ENTITY”不能缺少,实体名是将要被定义的实体名称,实体定义是指实体所取的值,通常是一个字符串。
2.1.5 实体 例如: <!ENTITY qhpress "清华大学出版社"> <!ENTITY tdpress “中国铁道出版社”> 上面的两行实体声明中,分别声明了qhpress和tdpress的实体,它们的值是“清华大学出版社”和“中国铁道出版社”。 (2)参数实体 参数实体的声明格式为: <!ENTITY % 实体名参数实体>
2.1.5 实体 其中,“!”和和关键词“ENTITY”意义同前。参数实体定义必须使用“%”。参数实体是指实体定义可以被引用的一种实体类型,例如: <!ENTITY % datatype “(#PCDATA)”> 这个实体定义了datatype为参数实体,取值为“#PCDATA”。也可以为实体定义多个可以选择的值。例如下面的参数实体type可以取三种数据类型STRING、INTEGER和DATE。 <!ENTITY % type “(STRING | INTEGER | DATE)”>
2.1.5 实体 下面的举例,定义了一个外部实体文件的URL,名为X的参数实体。 <!--声明外部参数实体--> <!ENTITY % X SYSTEM "http://www.kmnc.net/xml/x.dtd" > (3)内部实体 在XML文档中定义的实体,称为内部实体。一般实体和参数实体均可以作为内部实体或外部实体的内容使用,所以,内部实体也分为一般实体和参数实体。内部实体的定义方法就是一般实体和参数实体的定义方法。
2.1.5 实体 【例2.8】内部实体定义。 <?xml version="1.0" encoding="GB2312"?> <!DOCTYPE books [ <!ENTITY qhpress "清华大学出版社"> <!ENTITY tdpress “中国铁道出版社"> ]> <books> <book> <name>UML 2 工具箱</name> <author>Hans-Erik Eriksson et al.</author> <press>电子工业出版社</press> <price>65.00</price> <book> <!--more books information here--> <books>
2.1.5 实体 上面的程序中声明了两个实体qhpress和tdpress,因为,它们位于XML文档的内部,所以是内部实体。 程序中出现的DOCTYPE声明是用于引用外部或内部的文件或实体的专用命令,其含义和用法将在DTD中详细讨论。 (4)、外部实体 在XML文档外部,也可以定义实体。这个实体是与XML文档分离的独立文件,这种实体定义就是外部实体。其定义格式是: <!ENTITY 实体名SYSTEM/ PUBLIC 外部实体文件URI NDATA 类型名>
2.1.5 实体 其中,标示符SYSTEM和PUBLIC是不能缺少的,它们是定义外部实体的不可缺少的部分;外部实体文件URI是指外部实体的参考源,其内容是实体的替换文本,它可能与文档实体、包含外部DTD子集的实体、或某些其他的外部参数实体有关系。如果在外部实体定义中出现NDATA部分,则表示的“实体名”是一个不可解析的实体,否则是一个可解析的实体。例如: <!ENTITY fact SYSTEM "http://www.kmnc.net/xml/fact.xml"> <!ENTITY source SYSTEM "Conoff.gif" NDATA GIF> 在最后一个实体定义中,由于出现了NDATA部分,表明source是一个不可解析的实体。这里是把图形文件作为不可解析实体进行处理的。
2.1.5 实体 4、实体参考 实体参考是XML规范中正规使用的词汇,通俗的讲,所谓的实体参考就是实体的引用或实体的调用,这与程序设计语言中的函数和过程调用十分类似。 实体参考的方法,根据实体定义的不同而不同。 对于一般实体,其引用方法为:&实体名; 对于参数实体,其引用方法为:%实体名;
2.1.5 实体 【例2.9】实体引用示例。 <?xml version="1.0" encoding="GB2312"?> <!DOCTYPE books[ <!ENTITY qhpress "清华大学出版社"> <!ENTITY tdpress “中国铁道出版社"> ]> <books> <book> <name>UML 2 工具箱</name> <author>Hans-Erik Eriksson et al.</author> <press>电子工业出版社</press> <price>65.00</price> </book> <book> <name>XML精要:语法详解与编程指南</name> <author>[美]Sandra E. Eddy & B.K.DeLong</author> <press>&qhpress;</press>
2.1.5 实体 <price>68.00</price> </book> <book> <name>电子商务技术与应用</name> <author>越乃真</author> <press>&tdpress;</press> <price>14.90</price> </book> </books> 在除了自己定义的一般实体qhpress和tdpress的引用外,上述程序中还使用了符号实体“&”的引用&。读者可以通过浏览器检验上面程序的显示效果。
2.1.5 实体 关于参数实体的定义和引用,可以从下面的DTD定义中得到说明。 <!ENTITY % datatype " (#PCDATA)"> <!ELEMENT name %datatype;> <!ELEMENT author %datatype;> 在元素name和author中定义了它的类型是PCDATA(可解析字符数据),但是这个类型的定义通过了引用参数实体datatype来实现的。 参数实体的多值引用是实体引用中常见的,下面讨论多值参数实体的定义和引用。对于下面这样情况的元素定义,可以使用多值参数实体来实现。
2.1.5 实体 <!ELEMENT desk (Small | Middle | Large)> <!ELEMENT house (Small | Middle | Large)> <!ELEMENT shirt (Small | Middle | Large)> 这样的元素类型定义可以使用参数实体来实现。 <!ENTITY % SIZE “(Small|Middle|Large)”> <!ELEMENT desk %SIZE;> <!ELEMENT house %SIZE;> <!ELEMENT shirt %SIZE;>
2.1.5 实体 5、 注意事项 实体声明、定义和引用使XML文档变得结构良好,容易阅读和理解。但是使用实体应该注意: ① 在引用实体之前必须先定义实体。 ② 内部实体位于XML文档内部,外部实体独立于XML文档,是一个结构良好的XML格式文件。 ③实体引用不能出现递归引用,即不能出现A引用B,B又引用A的情形。 ④ 实体引用时,引用符”&”和”%”与实体名之间不能有空格,最后不能缺少英文符号的“;”。
2.1.6处理指令 处理指令允许XML文档包含用于应用程序的指令,简称PI。其格式如下: <?指令名 属性=“属性值”?> 处理指令用“<?”和“?>”包括起来。从形式上说,<?xml version=”1.0”?>就是处理指令,它的作用就是对XML文档进行标识。如下面的样式表转换引用的说明也是处理指令。 <?xml-stylesheet type="text/css" href="book.css"?> <?xml-stylesheet type="text/xsl" href="clothes.xsl"?>
2.1.6处理指令 前者是在样式表转换中引入了CSS文档对XML文档进行转换,后者是用XSL对XML文档进行格式转换。 XML的表示法(Notation)机制可以用于PI的正式声明中,在处理指令中不识别参数实体引用。
2.1.7CDATA节 在XML中出现的字符分为可解析的字符数据和不可解析的字符数据CDATA。如下面的程序片段是一段C程序,其功能用来实现在给定字符串的指定位置插入字符。 insert(int y[10],k,a) { int l; if (k<0 || k>10) printf("Error!"); else {for(l=10;l>=k;l--) y[l]=y[l-1]; y[k]=a; } }