600 likes | 882 Views
声明. 本课件仅用于北京航空航天大学计算机学院的教学; 本课件修改采用了一些网络资源(论文、研究报告、技术报告等),在采用的时候并没有准确标注引用信息。. X ML. 可扩展标记语言 XML ( eXtensible Markup Language ). XML 的设计源于标淮通用标记语言 SGML( S tandard G eneralized M arkup L anguage ) 和超文本标记语言 (HTML) 。 1996 年,万维网联盟 (W3C) 开始从事可扩展标记语言 XML(eXtensible Markup language) 的工作。
E N D
声明 • 本课件仅用于北京航空航天大学计算机学院的教学; • 本课件修改采用了一些网络资源(论文、研究报告、技术报告等),在采用的时候并没有准确标注引用信息。
可扩展标记语言XML (eXtensible Markup Language) • XML的设计源于标淮通用标记语言SGML(Standard Generalized Markup Language)和超文本标记语言(HTML)。 • 1996年,万维网联盟(W3C)开始从事可扩展标记语言XML(eXtensible Markup language)的工作。 • 1998年2月10日发布了XML1.0,它是一种开发简单而又可扩展的、结构化和半结构化信息文本表示机制。 • 最新版本: http://www.w3.org/TR/REC-xml/ W3C Recommendation 04 February 2004 • XML is a family of technologies: XSL, XSLT, XPath, Xlink, Xpointer, DOM, etc.
XML DTD Xpath Schema XLink Namespace XBase DOM Xpointer XInclusions Canonical XQuery XSL XML Information Set XForms XSLT SAX XSL-FO RDF P3P CSS PICS Signature XHTML SVG HDML BizTalk TV/WEB SMIL MathML WAP ebXML OEB VoiceXML CC/PP Micro-Payments PIP WAI…
An Example XML Document • <?xml version="1.0" encoding="ISO-8859-1"?> • <tradeBatch> • <trade account="2520034" action="buy" Duration = "good-till-canceled"> • <symbol>SUNW</symbol> • <quantity>1000</quantity> • <limit>20</limit> • <date>2001-03-05</date> • </trade> • <trade account="9240196" action="sell" duration="day"> • <symbol>CSCO</symbol> • <quantity>500</quantity> • <date>2001-03-05</date> • </trade> • </tradeBatch> • <!-- This is a comment -->
XML Document • The document is composed of declarations, elements, comments, character references, and processing instructions, all of which are indicated in the document by explicit markup • A data object is an XML document if it is well-formed, as defined in XML specification • A well-formed XML document may in addition be valid if it meets certain further constraints
XML Document Contents • XML declaration • Processing Instructions • Elements • Tags: Start-Tags, End-Tags • Attributes • Empty-Element Tags • PCDATA • CDATA • White Spaces • Comments Prolog Content
标记、元素和属性 • 标记是左尖括号(<)和右尖括号(>)之间的文本。开始标记和结束标记必须配对使用; • 元素是开始标记、结束标记以及位于二者之间的所有子元素; • 属性是一个元素的开始标记中的名称-值对。 • 在同一元素中,一个属性仅出现一次 • 属性必须有值 • 属性必须有用引号括起的值
XML 声明、注释、处理指令与实体 • XML 文档通常以 XML 声明作为开始,它向解析器提供了关于文档的基本信息。 • <?xml version="1.0" • encoding="gb2312"?> • 注释<!--……--> • 处理指令<?......?> • 实体<!ENTITY dw "developerWorks">
根元素 • XML 文档必须包含在一个单一元素中。这个单一元素称为根元素,它包含文档中所有文本和所有其它元素。 • <?xml version="1.0"?> • <!-- A well-formed document --> • <XML文档> • Hello, World! • </XML文档>
XML Namespace - 名称空间 • <definitions • xmlns:xsd="http://www.w3.org/2000/XMLSchema" • xmlns:xsd1=http://example.com/stockquote.xsd • xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" • xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://example.com/stockquote.wsdl"> • <types>……<types /> • </ definitions > • 名称空间定义了URI; • 名称空间重要性在于其唯一性
XML Namespace(续) • XML命名空间是一组具有结构的名称的集合,由W3C组织提出制订。 • 在XML中,用户可以自己定义tag和元素。但我们可以很容易想到,如果把多个XML文件合并为一个时,就很可能出现冲突。Namespaces就是为了解决这个问题的。 • 对XML Namespace严格的定义是:Namespace是用URI加以区别的,在XML文件的元素和属性中出现的所有名称的集合。有了Namespace,用户就可以保证在他的文件中使用的名称是独一无二的。 • 在没有Namespace的XML 1.0文件中,元素和属性中出现的名称无异于一族没有结构的字符。我们称它们为local names(当地名称)。当地名称在网络上是极不合适的。可以想象,网上会有成千上万的人使用同一个名称,而它们却代表了不同的意义。由于XML标准越来越丰富,命名空间也变得越来越重要。
XML示例(2) • <?xml version="1.0" encoding="gb2312" ?> • <简况> • <姓名>马殿富</姓名> • <单位>北京航空航天大学 计算机学院</单位> • <职称 职称系列="教学">教授</职称> • <授课> • <课程>离散数学</课程> • <课程>web 服务原理</课程> • </授课> • <手机>13701068603</手机> • <E-mail>dfma@nlsde.buaa.edu.cn</E-mail> • <住址>北京市海淀区大有北里</住址> • </简况>
Well-Formed XML Documents • A "Well Formed" XML document has correct XML syntax • A textual object is a well-formed XML document if it has the correct XML syntax: • It contains one or more elements • There is exactly one element, called the root, or document element • The name in an element's end-tag must match the element type in the start-tag; Names are case-sensitive • Each of the parsed entities which is referenced directly or indirectly within the document is well-formed
DTD • 文档类型定义(Document Type Definition ,DTD)是XML 1.0规范的一部分 • DTD可以定义词汇和词汇之间的语法规则,从而定义XML文档的结构。
1: <?XML version="1.0" standalone="yes"?> 2: <!DOCTYPE Students [ 4: <!ELEMENT Students (Student+)> 5: <!ATTLIST Students Class CDATA #REQUIRED> 6: <!ELEMENT Student (Name, Age?)> 7: <!ATTLIST Student SId CDATA #REQUIRED> 9: <!ELEMENT Name (#PCDATA)> 13: <!ELEMENT Age (#PCDATA)> 18: ]> 19: <Students Class=”SY9061”> 20: <Student SId="12345"> 21: <Name>Lin</Name> 22: <Age>20</Age> 23: <Address> 24: <Country>China</Country> 25: <City>BeiJing</City> 26: </Address> 27: </Student> 28: <Student SId="12345"> 29: <Name>Lin</Name> 30: </Student> 31: </Students>
DTD各要素 • ELEMENT –元素 • 元素类型声明 • ATTLIST • 特定元素类型可设置的属性及这些属性的允许值声明 • ENTITY • 可重用的内容声明 • NOTATION • 不需要解析的外部内容(例如:二进制数据)的格式声明,以及用于处理这些内容的外部应用程序
DTD与文档的关联 • DOCTYPE 标记 • 内部DTD子集 • <!DocType catalog[…内部声明 …]> • 外部DTD子集 • <!DOCTYPE catalog SYSTEM “http://myserver/decs/pubcatalog.dtd”>
有效性验证 • 利用D T D 和验证有效性的解析器,就能够立即对文档的完整性进行可靠的检查 。如果某个X M L 文档引用了D T D ,验证有效性的解析器应该读取D T D ,并确保文档符合D T D 中描述的语法
DTD的缺点 • DTD有自己的特殊的语法,本身不是XML文档因此,我们编写XML文档时,需要使用两套解析器:一套用来分析XML,判断文档是否格式良好;另一套用于分析DTD,再用分析的结果去检查XML文档,判断XML是否有效。 • DTD只提供了有限的数据类型 • 结构封闭,不具备扩展性。DTD不支持名域机制,因此,每个XML文档只能有一个DTD,从而限制了XML文档的继承和重用。
XML Information Set and Canonical XML • 语义相同的XML文档是否存在不同的表现方式? • 如何判断两个文件等价? • 是否存在标准的XML文件格式? UTF-8 <?xml version="1.0" encoding="gb2312" ?> <简况> <姓名>马殿富</姓名> <授课> <课程>离散数学</课程> <课程>web 服务原理</课程> </授课> <E-mail></E-mail> </简况> White space,CR, CR-LF, and LF line termination <E-mail/>
XML Information Set • 由W3C组织提出制订。XML Information Set的功能在于它提供了一套通用的语法以便于描述某一个XML文档的內容。 • XML Information Set定义了一组信息类别,包括文档(document) 、元素(element)、属性(attribute)、字符(character)、注释(comment)等十五种信息类别。通过这些信息类别来描述XML文档的不同方面。 • 从应用角度来看,任何XML处理器在处理某一XML文件的时候,即利用XML Information Set的信息类别来回传和描述XML文件的內容。 • W3C的其它很多XML相关技术规范在解释其XML语法的时候都是使用XML Information Set作为基本工具来实施语法描述,XML Information Set目前已经成为基于XML的技术规范文档中描述语法的标准手段。
XML Information Set是抽象数据集。XML Information Set提供一些一致的定义,其他规范在使用格式良好的XML文档信息时,可以使用这些定义。 • XML文档的信息集合由许多信息项(Information Item)构成,每个信息项都有多个属性(properties)。 • XML Information Set为了更清晰和简便,把信息集表现为树,但是XML Information Set并不一定组织成树状结构。 • “Information Set”和“Information Item”与通常的“tree”,“node”有相似的含义。
Information Set中包含了11种不同的Information Item。 • The Document Information Item • Element Information Item • Attribute Information Item • Processing Instruction Information Item • Character Information Item • Comment Information Item • The Document Type Declaration Information Item • Unexpanded Entity Reference Information Item • Unparsed Entity Information Item • Notation Information Item • Namespace Information Item
What is not in Information set • The content models of elements, from ELEMENT declarations in the DTD. • The grouping and ordering of attribute declarations in ATTLIST declarations. • The document type name. • White space outside the document element. • White space immediately following the target name of a PI. • Whether characters are represented by character references. • The difference between the two forms of an empty element: <foo/> and <foo></foo>. • White space within start-tags (other than significant white space in attribute values) and end-tags. • The difference between CR, CR-LF, and LF line termination.
The order of attributes within a start-tag. • The order of declarations within the DTD. • The boundaries of conditional sections in the DTD. • The boundaries of parameter entities in the DTD. • Comments in the DTD. • The location of declarations (whether in internal or external subset or parameter entities). • Any ignored declarations, including those within an IGNORE conditional section, as well as entity and attribute declarations ignored because previous declarations override them. • The kind of quotation marks (single or double) used to quote attribute values. • The boundaries of general parsed entities. • The boundaries of CDATA marked sections. • The default value of attributes declared in the DTD.
Canonical XML • 由W3C组织提出制订。 • 在XML 1.0标准的允许下,由于语法形式的可变性,文档的物理表示具有多样性,例如多个空格与单个空格的等价,例如回车换行的任意性。该标准就是要描述一种方法,能产生XML文档范式形式,即规范的形式。对于逻辑上等价的多个XML文档,通过Canonical XML进行规范化之后,应该完全一样。 • 这一变换的应用领域主要是数字签名,通过规范化之后,再实施数字签名(例如XML Signature),那么逻辑相同的XML文档将不会出现无法通过签名校验的情况。
ASCII • 最初,Internet上只有一种字符集——ANSI的ASCII字符集(American Standard Code for Information Interchange, “美国信息交换标准码) • 它使用7 bits来表示一个字符,总共表示128个字符,编码范围是0×00-0×7F。 • ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0×00-0×20和0×7F共33个控制字符。
ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0×00-0xFF,0×00-0×7F之间完全和ASCII一致,0×80-0×9F之间是控制字符,0xA0-0xFF之间是文字符号。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0×00-0xFF,0×00-0×7F之间完全和ASCII一致,0×80-0×9F之间是控制字符,0xA0-0xFF之间是文字符号。 • ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。 • ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。 • 因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。
Unicode and UCS • 由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。 • 因此,需要制定可以容纳全世界所有语言文字的编码方案。Unicode组织和ISO组织都试图定义一个超大字符集,目的是要涵盖所有语言使用的字符以及其他学科使用的一些特殊符号。 • Unicode的学名是“Universal Multiple-Octet Coded Character Set”,简称为UCS。 • UCS可以看作是“Unicode Character Set”的缩写。
Unicode: unicode.org制定的编码机制, 要将全世界常用文字都函括进去. • 在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应一个字符; • 在2.0开始抛弃了16位限制, 原来的16位作为基本位平面, 另外增加了16个位平面, 相当于20位编码, 编码范围0到0x10FFFF.
ISO 10646标准定义了一个31位的字符集。 • 前两个字节的位置(0×0000-0xFFFD)被称为基本多语言面(Basic Multilingual Plane, BMP) • 超出两个字节的范围称作辅助语言面。 • BMP基本包括了所有语言中绝大多数字符,所以只要支持BMP就可以支持绝大多数场合下的应用。
在1991年前后,双方都认识到世界不需要两个不兼容的字符集。 • 从unicode2.0开始, unicode采用了与ISO 10646-1相同的字库和字码, • ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值, 使得两者保持一致. • 每个Unicode版本号都能找到相对应的ISO 10646版本号。 • Unicode 3.0对应的字符集在BMP范围内。
UCS-2 & UTF-16 • UCS只是规定如何编码,并没有规定如何传输、保存这个编码。 • 例如“汉”字的UCS编码是6C49 • UTF-8、UTF-7、UTF-16都是被广泛接受的方案。 • UTF是“UCS Transformation Format”的缩写。
UCS-2、UTF-16是UCS字符集(或者说是Unicode字符集)实际应用中的具体编码方式。UCS-2、UTF-16是UCS字符集(或者说是Unicode字符集)实际应用中的具体编码方式。 • UCS-2是两个字节的等宽编码,因为只是使用了两个字节的编码空间,所以只能对BMP中的字符做编码。 • UCS-2不同于GBK和Big5,它是真正的等宽编码,每个字符都使用两个字节,这个特性在字符串截断和字符数计算时非常方便。
UTF-16是变长编码,用两个字节对BMP内的字符编码,用4个字节对超出BMP范围的辅助平面内的字符作编码。 • UTF-16是UCS-2的超集,UTF-16编码的两字节编码方式完全和UCS-2相同,也就是说在BMP的框架内UCS-2完全等同与UTF-16。
UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”? • Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。
BOM是一个有点小聪明的想法: • 在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。 • 这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
(重复说明) • UCS-2和UTF-16在存储和传输时会使用两种不同的字节序,分别是big endian和little endian(大尾和小尾)。 • 例如“啊”(U+554A)用big endian表示就是0×554A,用little endian表示就是0×4A55。 • UCS-2和UTF-16默认的字节序是big endian方式。 • 在传输过程中为了说明字节序需要在字节流前加上BOM(Byte order Mark),0xFEFF表示是big endian,0xFFFE表示是little endian。 • UCS-2BE、UCS-2LE是实际应用中使用的编码名称,对应着big endian和little endian,UTF-16BE、UTF-16LE也是如此。因为默认是BE字节序,所以可以把UCS-2当做是UCS-2BE的别名
UTF-8 • UTF-8是UCS字符集的另一种编码方式,UTF-16的每个单元是两个字节(16位),而UTF-8的每个单元是一个字节(8位)。 • UTF-16中用一个或两个双字节表示一个字符,UTF-8中用一个或几个单字节表示一个字符。 • 可以认为UTF-8编码是根据一定规律从UCS-2转换得到的,从UCS-2到UTF-8之间有以下转换关系:
例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。 • 例如“啊”字的UCS-2编码是0×554A,对应的二进制是0101 0101 0100 1010,转成UTF-8编码之后的二进制是1110 0101 10 010101 10 001010,对应的十六进制是0xE5958A。
根据UTF-8的生成规律和UCS字符集的特性,可以看到UTF-8具有的特性:根据UTF-8的生成规律和UCS字符集的特性,可以看到UTF-8具有的特性: • UTF-8完全和ASCII兼容,也就是说ASCII对应的字符在UTF-8中和ASCII编码完全一致。范围在0×00-0×7F之内的字符一定是ASCII字符,不可能是其他字符的一部分。GBK和Big5都存在的缺陷在UTF-8中是不存在的。 • 大于U+007F的UCS字符,在UTF-8编码中至少是两个字节。 • UTF-8中的每个字符编码的首字节总在0×00-0xFD之间(不考虑UCS-4支持的情况,首字节在0×00-0xEF之间)。根据首字节就可以判断之后连续几个字节。 • 非首字节的其他字节都在0×80-0xBF之间;0xFE和0xFF在UTF-8中没有被用到。 • GBK编码中的汉字字符都在UCS-2中的范围都在U+0800 - U+FFFF之间,所以每个GBK编码中的汉字字符的UTF-8编码都是3个字节。但GBK中包含的其他字符的UTF-8编码就不一定是3个字节了,如GBK中的俄文字符。 • 在UTF-8的编码的传输过程中即使丢掉一个字节,根据编码规律也很容易定位丢掉的位置,不会影响到其他字符。在其他双字节编码中,一旦损失一个字节,就会影响到此字节之后的所有字符。从这点可以看出UTF-8编码非常适合作为传输编码。
软件及字符集的应用 • 当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。 • 软件一般采用三种方式来决定文本的字符集和编码: • 检测文件头标识 • 提示用户选择 • 根据一定的规则猜测 • 最标准的途径是检测文本最开头的几个字节,开头字节 Charset/encoding,如下表: EF BB BFUTF-8FE FFUTF-16/UCS-2, little endianFF FEUTF-16/UCS-2, big endianFF FE 00 00UTF-32/UCS-4, little endian.00 00 FE FFUTF-32/UCS-4, big-endian.
为了接收字节流时能正确识别编码,很多情况下发送字节流的同时会把字节流对应的编码发送给接收方,这种情况可以理解为发送和接收双方的约定。HTTP协议就有这样的约定,浏览器就是通过约定来识别网页的编码。HTTP协议的响应头会有这样的约定:为了接收字节流时能正确识别编码,很多情况下发送字节流的同时会把字节流对应的编码发送给接收方,这种情况可以理解为发送和接收双方的约定。HTTP协议就有这样的约定,浏览器就是通过约定来识别网页的编码。HTTP协议的响应头会有这样的约定: • Content-Type: text/html;charset=utf-8
如果打开一个本地的Html文件,其中也会有关于字符编码的约定:如果打开一个本地的Html文件,其中也会有关于字符编码的约定: • <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8“/> • 邮件客户端程序也是通过上述约定来识别字符的,在邮件的头部有Charset的声明。 • UCS-2/UTF-16的BOM头也可以理解为是字符编码的约定,打开文本文件时可以用BOM来识别编码。
Java 编程语言的本机字符编码方案是 UTF-16。因此 Java 平台的 charset 定义了 16 位 UTF-16 代码单元序列和字节序列之间的映射关系。 • Java 平台的每一种实现都需要支持以下标准 charset。 • US-ASCII, 7 位 ASCII 字符,也叫作 ISO646-US、Unicode 字符集的基本拉丁块 • ISO-8859-1,ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 • UTF-8, 8 位 UCS 转换格式 • UTF-16BE, 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序 • UTF-16LE, 16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序 • UTF-16, 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识