1 / 87

第二章 XML 的语法基础

第二章 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>

jaegar
Download Presentation

第二章 XML 的语法基础

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第二章 XML的语法基础 2.1 XML的语法基础 2.2 XML的文档结构 2.3 名称空间 2.4 语言标识

  2. 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>

  3. 2.1 XML的语法基础 这是一个描述图书信息的XML文档。根元素是booklist,下面有若干个子元素book,在book中有表示具体数据的子元素name、author、press、pubdate、price 五个元素。另外,book元素还包含一个附属于它的属性isbn。

  4. 2.1.1结构良好性 结构良好性(well-formedness)是XML规范中特别强调的重要概念,XML文档的书写必须满足“结构良好(well-formed)”的原则。所谓的结构良好的必要条件是: (1) 它总体是一个XML文档。 (2)它满足所有在XML1.0规范中提出的关于结构良好性的约束。

  5. 2.1.1结构良好性 (3)在XML文档中被直接或间接引用的每一个实体也是结构良好的。 其中关于XML文档的定义如下: ◆它包含至少一个元素。 ◆有一个叫做根或文档的元素,它不能作为任何其他元素的内容出现。

  6. 2.1.1 结构良好性 是什么原因使W3C对结构良好性如此重视,以至于在XML1.0规范的开篇之处就讨论结构良好的问题?这是因为,过去几年来,WWW在Internet上取得了巨大成就,但是,用于描写WWW的基本编程语言是HTML。相当数量的人在书写HTML时的不规范性和随意性,使得HTML文件的可读性大大降低,甚至出现混乱的局面,如写标签时不写结束标签,写属性值

  7. 2.1.1 结构良好性 不用引号(”或’),不区分大小写等。W3C的专家们期望XML规范是下一代的WWW的主要编程语言和标准,他们不希望几年后,XML的使用也象HTML一样出现任何问题。 所以,把结构良好性写在了XML1.0规范的重要位置,用以强调XML文档中的所有词素和语法必须是定义明确的,结构良好的。

  8. 2.1.2XML声明 在例2.1中的第一行出现的<?xml version=”1.0”?>是XML规范规定的所有XML文件必须具有的一行,称为XML声明,并规定,这个声明必须写在每一个XML文档的第一行,以标记这是一个XML文档,否则它就不是一个XML文档,并依此来区别于其他文档。 1、XML声明 XML声明的格式为: <?xml version=”1.0” encoding=”” standalone=””?>

  9. 2.1.2XML声明 一般情况下,上面格式中可以省去encoding和standalone。 XML的解析程序可以正确地得到上面文本的正确结果。对于其它的字符集合,必须事先声明。 2、XML的字符选择 XML文档的默认字符系统是UTF-8,与传统的ACSII字符集一致,如果处理的是英文字符,这已经满足了需要。此时XML文档可以使用英文字符。如果使用其它国家的代码,如拉丁文字,中文、朝鲜文、日文,则必须使用Unicode字符集来定义

  10. 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后的代码。

  11. 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的代码集合的正确使用。如果要使用中文字符集,必须有

  12. 2.1.2XML声明 encoding = "GB2312"声明。因为,GB2312中列出了基本的汉字交换标准。如下的字符声明。 【例2.5】字符集为GB2312的XML文档。 <?xml version="1.0" encoding="GB2312"?> <hello>你好,世界!</hello> 请读者用浏览器浏览,看看结果怎样。如果删除encoding = “GB2312”,情况又会怎样?读者可以自己试一试。 3、standalone属性 独立文档声明(standalone),以XML声明的成分出现,告

  13. 2.1.2XML声明 诉文档是否存在一个外部的文档实体或参数实体。即,在XML声明中的standalone 属性用来定义是否存在外部的标记声明。如果不存在外部的标记声明,standalone 取值为“yes”。如果可能存在这类外部标记声明,则取值为“no”。如果不存在外部的标记声明,standalone声明没有意义。如果存在外部标记声明而又没有写明standalone的取值,则系统取值为“no”。 任何有standalone=”no”声明的XML文档,可以在算法上转变成可独立(standalone)文档,这种文档对某些网络发布应用可能是需要的。

  14. 2.1.3 XML的元素 1.元素标记 元素标记简称标记(tag)。XML的标记与HTML中的标记一样,所不同的是HTML的标记由HTML规范规定,XML的标记由用户自己规定。 在XML中,标记分为开始标记和结束标记。开始标记由小于符号“<”和“>”大于符号把标记名括起来。结束标记是在开始标记的小于符号“<”后紧跟符号“/”。如上例中的<book>,<name>是开始标记,它们的结束标记分别是</book>,</name>。

  15. 2.1.3 XML的元素 在开始标记和结束标记中包含的任意字符串称为元素值。除了包含元素值以外,在开始标记和结束标记还可以包含下一级子元素。如,<name>数据通信与计算机网络</name>定义了一个图书书名的元素,元素值是“数据通信与计算机网络”。而<book>……</book>包含的就是多个下一级子元素。 标记的一般命名规则要求具有确切含义,如booklist定义了图书列表,author定义了作者元素,press定义了出版社元素等。除此之外,还有如下要求: ①首字符是英文、汉字字符或其他字符,后跟数字或其他符号。

  16. 2.1.3 XML的元素 ②严格区分英文字母的大小写。 ③不能使用XML或xml作为元素名称。 ④不能独立使用数字作为元素名。 ⑤在元素名中可以使用“_”、“.”等符号。 ⑥不能使用“<、>、?、/、&、+、*”等符号作为元素名。 为了便于理解上述定义,下面是一些合法和非法的标记名示例。

  17. 2.1.3 XML的元素 不合法的元素标记: <123></123> 数字开头 <Name></name> 大小写不匹配 <person></PERSON> 大小写不匹配 <STUDENT?NO></STUDENT?NO> 使用非法字符 <press>高等教育出版社<press> 没有结束标记

  18. 2.1.3 XML的元素 合法的元素标记: <x123></x123> <student_name></student_name> <Name></Name> <person></person> <student_no></student_no> <学号></学号> <姓名></姓名>

  19. 2.1.3 XML的元素 2、元素嵌套 每个XML文档必须有一个且只能有一个称之为“根”(root)的元素,如例2.1中的<booklist>。其他元素必须写在一对根元素<booklist>和</booklist>之间。 元素可以包含值,可以为空值,还可以有下层子元素。 某元素的子元素写在该元素的开始标记之后和结束标记之前,如每一个<book>元素下的所有子元素写在<book>之后和</book>之前,这种结构称为元素嵌套。

  20. 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>是同级元素,但交叉嵌套,因此错误。

  21. 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)错误。

  22. 2.1.3 XML的元素 3、空元素 当元素标记之间没有元素值时,这样的元素叫空元素。如图2.1(a)中的元素<b>、<c>是空元素,但是<a>不是空元素,因为它包含了两个子元素,虽然其子元素为空。 当元素为空值时,其表示可以简化成用“<”和“/>”包括元素名。如:<name></name>简化成<name/>,<phone></phone>可以简写成<phone/>。 对于在XML转换文档中的出现的某些无结束元素的HTML元素,如<img>、<br>、<hr>,为了满足结构良好性,在XML转换

  23. 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

  24. 2.1.4 属性 都是属性分别定义颜色、字体、字大小。后者定义图形,其中src、width、height、alt也是属性。这说明在HTML中大量使用了属性。 1. 属性的定义 在XML文档中,属性是用来与元素联系起来的一对“名字-值”,属性的定义不能出现在元素的开始标记和空元素标记之外。元素的属 性可以是一个,也可以是多个。当出现多个属性时,每个属性之间用空格分隔。多个属性又叫属性列表,对于一个给定的元素,属性列表是附属于这个元素的属性集合,

  25. 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这两个属性关联起来,使之

  26. 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的语

  27. 2.1.4 属性 法规则。如例2.7所示。此时currency和unit这两个原来是price元素的属性,现在成为<shirt>的子元素,与price元素形成平级关系,这并不违反XML的语法规则。但是这样做,消除了currency和unit这两个元素跟price元素之间的直接关联关系,可以把它们理解成是与其它元素平级的元素,这与原来的设计意图是矛盾的。另外作为独立元素的unit到底是想表示价格的单位还是衬衫的单位,意义就不明确。所以在设计元素和元素属性时,事先应该仔细考虑。

  28. 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>

  29. 2.1.4 属性 2、属性类型 XML属性类型有三种:字符串类型、标记化类型和枚举类型。字符串类型可以取任意的文字串作为值。标记化类型有不同的词法和语义约束。有关属性的定义、使用和说明将在第三章DTD和第四章XML Schema中进行。

  30. 2.1.5 实体 1、实体概念 XML文档可以包含至少一个存储单元,这些存储单元叫实体,它们全部都有内容且由实体名称来标识(除了文档实体和外部DTD子集外)。每个XML文档有一个叫文档的实体,用来做为XML处理器的起始位置,并可以包含整个XML文档。 实体可以是可解析的和不可解析的。所谓可解析实体是:其内容与替换文本相联系,这个替换文本是XML文档的一个整体部分。所谓不可解析实体的是:它的内容可以是或者不是文本(text),如果是文本,那么不是XML。每一个不可

  31. 2.1.5 实体 解析的实体与一个表示法 (notation)联系,由名称标识。除了要求XML处理器把这些用于实体和表示法的标识符应用于应用程序外,XML对不可解析实体的内容没有约束。 2、引入实体的原因 在XML文档中,由于规定使用“<、>、’、”、&”等符号作为XML文本的标记和内容声明的组成部分,我们通常把这些符号叫做XML的保留字。当需要在XML文档数据中写入上述这些字符时,如果不进行转换,解析器将会把它们理解成XML规范定义的含义,而无法实现把这些符号作为元素数据的目的。

  32. 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所示。

  33. 2.1.5 实体 需要实体的另外一个原因是,可以通过实体引用调用事先定义好的内部或者外部实体,使多个XML文档可以访问和调用同一个实体。 3、实体声明 实体类别可以按照引用方式和所处位置这两种方式来分类。按引用方式可以分为一般实体和参数实体,按实体所处的位置可以分为内部实体和外部实体。内部实体和外部实体的具体内容由一般实体和参数实体定义。无论是哪类实体,在使用之前都必须先声明,没有声明的实体的引用被认为是错误的。

  34. 2.1.5 实体 如果在XML文档中多次声明了同一个实体,则XML处理器可能发布一个警告。 实体的声明因为其类型不同,方法各有差异,下面分别予以介绍。 (1)一般实体 一般实体的声明格式为: <!ENTITY 实体名实体定义> 其中,前面的“!”和关键词“ENTITY”不能缺少,实体名是将要被定义的实体名称,实体定义是指实体所取的值,通常是一个字符串。

  35. 2.1.5 实体 例如: <!ENTITY qhpress "清华大学出版社"> <!ENTITY tdpress “中国铁道出版社”> 上面的两行实体声明中,分别声明了qhpress和tdpress的实体,它们的值是“清华大学出版社”和“中国铁道出版社”。 (2)参数实体 参数实体的声明格式为: <!ENTITY % 实体名参数实体>

  36. 2.1.5 实体 其中,“!”和和关键词“ENTITY”意义同前。参数实体定义必须使用“%”。参数实体是指实体定义可以被引用的一种实体类型,例如: <!ENTITY % datatype “(#PCDATA)”> 这个实体定义了datatype为参数实体,取值为“#PCDATA”。也可以为实体定义多个可以选择的值。例如下面的参数实体type可以取三种数据类型STRING、INTEGER和DATE。 <!ENTITY % type “(STRING | INTEGER | DATE)”>

  37. 2.1.5 实体 下面的举例,定义了一个外部实体文件的URL,名为X的参数实体。 <!--声明外部参数实体--> <!ENTITY % X SYSTEM "http://www.kmnc.net/xml/x.dtd" > (3)内部实体 在XML文档中定义的实体,称为内部实体。一般实体和参数实体均可以作为内部实体或外部实体的内容使用,所以,内部实体也分为一般实体和参数实体。内部实体的定义方法就是一般实体和参数实体的定义方法。

  38. 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>

  39. 2.1.5 实体 上面的程序中声明了两个实体qhpress和tdpress,因为,它们位于XML文档的内部,所以是内部实体。 程序中出现的DOCTYPE声明是用于引用外部或内部的文件或实体的专用命令,其含义和用法将在DTD中详细讨论。 (4)、外部实体 在XML文档外部,也可以定义实体。这个实体是与XML文档分离的独立文件,这种实体定义就是外部实体。其定义格式是: <!ENTITY 实体名SYSTEM/ PUBLIC 外部实体文件URI NDATA 类型名>

  40. 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是一个不可解析的实体。这里是把图形文件作为不可解析实体进行处理的。

  41. 2.1.5 实体 4、实体参考 实体参考是XML规范中正规使用的词汇,通俗的讲,所谓的实体参考就是实体的引用或实体的调用,这与程序设计语言中的函数和过程调用十分类似。 实体参考的方法,根据实体定义的不同而不同。 对于一般实体,其引用方法为:&实体名; 对于参数实体,其引用方法为:%实体名;

  42. 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 &amp; B.K.DeLong</author> <press>&qhpress;</press>

  43. 2.1.5 实体

  44. 2.1.5 实体 <price>68.00</price> </book> <book> <name>电子商务技术与应用</name> <author>越乃真</author> <press>&tdpress;</press> <price>14.90</price> </book> </books> 在除了自己定义的一般实体qhpress和tdpress的引用外,上述程序中还使用了符号实体“&”的引用&amp;。读者可以通过浏览器检验上面程序的显示效果。

  45. 2.1.5 实体 关于参数实体的定义和引用,可以从下面的DTD定义中得到说明。 <!ENTITY % datatype " (#PCDATA)"> <!ELEMENT name %datatype;> <!ELEMENT author %datatype;> 在元素name和author中定义了它的类型是PCDATA(可解析字符数据),但是这个类型的定义通过了引用参数实体datatype来实现的。 参数实体的多值引用是实体引用中常见的,下面讨论多值参数实体的定义和引用。对于下面这样情况的元素定义,可以使用多值参数实体来实现。

  46. 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;>

  47. 2.1.5 实体 5、 注意事项 实体声明、定义和引用使XML文档变得结构良好,容易阅读和理解。但是使用实体应该注意: ① 在引用实体之前必须先定义实体。 ② 内部实体位于XML文档内部,外部实体独立于XML文档,是一个结构良好的XML格式文件。 ③实体引用不能出现递归引用,即不能出现A引用B,B又引用A的情形。    ④ 实体引用时,引用符”&”和”%”与实体名之间不能有空格,最后不能缺少英文符号的“;”。

  48. 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"?>

  49. 2.1.6处理指令 前者是在样式表转换中引入了CSS文档对XML文档进行转换,后者是用XSL对XML文档进行格式转换。 XML的表示法(Notation)机制可以用于PI的正式声明中,在处理指令中不识别参数实体引用。

  50. 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; } }

More Related