思胜.net高级培训内部Part Ⅴ XML

更新时间:2023-04-27 11:01:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Part Ⅴ郝冠军
XML
2009/12/11
第 16 天 字符编码和 XML .......................................................................................................... 5 16.1. 计算机中的字是如何处理的? ............................................................................... 5 16.2. 字符编码................................................................................................................... 5 16.2.1. 第一个编码表 ASCII .............................................................................................. 5 16.2.2. ISO8859 .................................................................................................................... 6 16.2.3. GB2312 ..................................................................................................................... 7 16.2.4. 不一样的中文 ........................................................................................................... 8 16.2.5. UNICODE ................................................................................................................. 9 16.3. 现实中的 Unicode .................................................................................................... 9 16.3.1. UCS-2 面临的问题................................................................................................... 9 16.3.2. 新希望 UTF-8 ........................................................................................................ 10 16.4. 应用中的 Unicode ................................................................................................. 11 16.4.1. 记事本中的 Unicode ............................................................................................. 11 16.4.2. Java 的处理............................................................................................................ 11 16.4.3. .Net 的处理 ............................................................................................................ 11 16.4.4. Web 中的问题 ....................................................................................................... 12 16.5. 总结......................................................................................................................... 12 16.6. .NET 中的字符编码 .............................................................................................. 13 16.6.1. C# 中的 char 数据类型 ....................................................................................... 13 16.6.2. Encoding 类 ........................................................................................................... 13 16.6.3. 常用的编码实现 ..................................................................................................... 13 16.6.4. 字符流..................................................................................................................... 14 第 17 天 XML,DTD,Schema ...........

...................................................................................... 16 17.1. XML 的简单历程 .................................................................................................. 16 17.2. XML 的结构 .......................................................................................................... 16 17.2.1. 通过文本描述 ......................................................................................................... 17 17.2.2. 明确的编码............................................................................................................. 17 17.2.3. 层次的标记语言 ..................................................................................................... 17 17.2.4. XML 文件的一些特点: ...................................................................................... 18 17.3. XML 结构的定义 .................................................................................................. 20 17.4. DTD ........................................................................................................................ 20 17.4.1. 定义不包含内容的元素 ......................................................................................... 21 17.4.2. 定义包含文本内容的元素 ..................................................................................... 21 17.4.3. 定义包含有子元素的元素 ..................................................................................... 22 17.4.4. 多个子元素的定义 ................................................................................................. 22 17.4.5. 如何控制子元素出现的次数 ................................................................................. 23 17.4.6. 数据类型的定义 ..................................................................................................... 23 17.4.7. 属性的定义............................................................................................................. 24 17.4.8. 实体......................................................................................................................... 25 17.4.9. DTD 的标记 .......................................................................................................... 26 17.4.10. 单独文件的 DTD........................................................................................... 26 17.4.11. 公共的 DTD................................................................................................... 27 17.5. Xml Schema ............................................................................................................ 27 17.5.1. 定义简单的 Schema .............................................................................................. 272
17.5.2. XML 的命名空间 .................................................................................................. 28 17.5.3. 简单

类型和复杂类型 ............................................................................................. 28 17.5.4. 通过 ref 简化复杂的 XMLSchema ..................................................................... 30 17.5.5. 定义属性................................................................................................................. 31 17.5.6. 定义子元素的数量 ................................................................................................. 32 17.5.7. 定义可选的子元素 ................................................................................................. 33 17.5.8. 稍微更复杂的可选项子元素,可以设置缺省值 ................................................. 35 17.5.9. XML Schema 内置简单类型 ................................................................................. 36 17.5.10. 元素的属性如何在 Schema 文档中定义 ...................................................... 40 17.5.11. 使用属性组 ..................................................................................................... 41 17.6. XPath....................................................................................................................... 42 17.7. XSLT ....................................................................................................................... 45 17.7.1. 开始,模版和取值 ................................................................................................. 45 17.7.2. 如何取得属性的内容 ............................................................................................. 46 17.7.3. 递归运算................................................................................................................. 47 17.7.4. 循环......................................................................................................................... 49 17.7.5. 判断......................................................................................................................... 51 17.7.6. 变量......................................................................................................................... 53 17.7.7. 将模版作为函数调用 ............................................................................................. 53 第 18 天 在程序中使用 XML .................................................................................................... 55 18.1. 文档对象模型 DOM ............................................................................................. 55 18.1.1. 从树形结构的角度来看 DOM............................................................................... 55 18.1.2. 从面向对象的角度看 DOM ................................................................................. 57 18.1.3. 使用 XPath ............................................................................................................. 60

18.1.4. 创建和删除节点 ..................................................................................................... 61 18.2. 简单的访问 XML 的 API :SAX ...................................................................... 62 18.3. XML 流 .................................................................................................................. 63 18.3.1. XmlReader .............................................................................................................. 63 18.3.2. XmlWriter ............................................................................................................... 65 18.4. 经过优化的 XPath ................................................................................................. 65 18.5. 处理有命名空间的元素和属性 ............................................................................. 67
18.6.
处理 Excel 的程序集 ExcelXmlWriter
....................................... 69
18.7. Xslt 转换 ................................................................................................................ 73 18.8. 验证 XML .............................................................................................................. 75 18.9. Xml 序列化............................................................................................................ 76 18.10. XML 的加密和解密 .............................................................................................. 80 介绍................................................................................................................................. 80 xml 加密的例子 ............................................................................................................. 81 第 19 天 Web Service .................................................................................................................. 86 19.1. 概述......................................................................................................................... 863
19.2. 从 SOAP 说起....................................................................................................... 86 19.3. WSDL ..................................................................................................................... 88 19.4. DISCO..................................................................................................................... 89 19.5. UDDI....................................................................................................................... 89 19.6. 开发 WebService.................................................................................................... 89 19.7.1. 创建 Web Service........................................................................................... 89 19.7.2. 访问 Web 服务的协议.................................................................................. 91 19.7.3. 测试 Web 服务.......

....................................................................................... 94 19.7.4. 访问 Web 服务.............................................................................................. 98 19.7.5. 同步访问和异步访问 ................................................................................... 102 19.7. 服务的安全........................................................................................................... 105 19.7.1. 基于 Windows 和 IIS 的安全验证 ........................................................... 105 19.7.2. 基于 SOAPHeader 的安全验证 ................................................................. 106 19.8. WSE ...................................................................................................................... 108 19.7.1. 下载地址: ................................................................................................... 110 19.7.2. 安全基本概念 ............................................................................................... 110 19.7.3. 安装 WSE 3.0 .............................................................................................. 113 19.7.4. 使用 WSE 实现匿名安全 .......................................................................... 115 19.7.5. 使用 WSE 实现基于用户名密码的安全................................................... 124 19.7.6. MTOM 消息传输优化 ................................................................................ 132
4
第 16 天 字符编码和 XML海阔凭鱼跃,天空任鸟飞
16.1. 计算机中的字是如何处理的?如果你用放大镜看一下, 可以看出屏幕上的字是由一个一个的像素点组成的, 每一个字 符用一组像素点拼接出来,这些像素点组成一幅图像,变成了我们的文字,计算机又是如何 将我们的文字保存起来的呢?是用一个个的点组成的图像将文字保存起来的吗?当然不是, 让我们从英文开始,由于英文是拼音文字,实际上所有的英文字符和符号加起来也不超过 100 个,在我们的文字中存在着如此大量的重复符号,这就意味着保存每个字符的图像会有 大量的重复,比如 e 就是出现最多的符号等等。所以在计算机中,实际上不会保存字符的 图像。
16.2. 字符编码由于我们的文字中存在着大量的重复字符,而计算机天生就是用来处理数字的,为了减 少我们需要保存的信息量, 我们可以使用一个数字编码来表示每一个字符, 通过对每一个字 符规定一个唯一的数字代号,然后,对应每一个代号,建立其相对应的图形,这样,在每一 个文件中, 我们只需要保存每一个字符的编码就相当于保存了文字, 在需要显示出来的时候, 先取得保存起来的编码,然后通过编码表,我们可以查到字符对应的图形,然后

将这个图形 显示出来,这样我们就可以看到文字了,这些用来规定每一个字符所使用的代码的表格,就 称为编码表。编码就是对使用字符的一种数字编号。
16.2.1. 第一个编码表 ASCII在最初的时候,美国人制定了第一张编码表 《美国标准信息交换码》 ,简称 ASCII,它总 共规定了 128 个符号所对应的数字代号, 使用了 7 位二进制的位来表示这些数字。 其中包 含了英文的大小写字母、数字、标点符号等常用的字符,数字代号从 0 至 127,ASCII 的 表示内容如下: 0 – 31 控制符号 32 空格 33-47 常用符号 48-57 数字 58-64 符号 65-90 大写字母 91-96 符号5
97-122
小写字母
注意,32 表示空格,虽然我们再纸上写字时,只要手腕动一下,就可以流出一个空格,但 是,在计算机上,空格与普通得字符一样也需要用一个编码来表示,33-127 共 95 个编码用 来表示符号,数字和英文的大写和小写字母。比如数字 1 所对应的数字代号为 49,大写字 母 A 对应的代号为 65, 小写字母 a 对应的代号为 97。 所以, 我们所写的代码 hello, world 保存在文件中时,实际上是保存了一组数字 104 101 108 108 111 44 32 119 111 114 108 100。 我们在程序中比较英文字符串的大小时,实际上也是比较字符对应的 ASCII 的编码大小。 由于 ASCII 出现最早,因此各种编码实际上都受到了它的影响,并尽量与其相兼容。
16.2.2. ISO8859美国人顺利解决了字符的问题, 可是欧洲的各个国家还没有, 比如法语中就有许多英语 中没有的字符,因此 ASCII 不能帮助欧洲人解决编码问题。 为了解决这个问题,人们借鉴 ASCII 的设计思想,创造了许多使用 8 位二进制数来表示 字符的扩充字符集,这样我们就可以使用 256 种数字代号了,表示更多的字符了。在这些字 符集中,从 0 - 127 的代码与 ASCII 保持兼容,从 128 到 255 用于其它的字符和符号, 由于有很多的语言, 有着各自不同的字符, 于是人们为不同的语言制定了大量不同的编码表, 在这些码表中, 128 - 255 表示各自不同的字符, 从 为了统一字符编码, 国际标准化组织 ISO 制定了字符编码的国际标准 ISO8859,这个标准得到了广泛的使用。 ISO8859 包括 14 个单字节的字符集: ? ISO 8859-1 包括:丹麦语、荷兰语、芬兰语、法语,德语、冰岛语、挪威语、葡 萄牙语、西班牙语和瑞典语。 ? ISO 8859-2 包括:捷克语、英语、德语、匈牙利语、波兰语、罗马尼亚语、克罗 地亚语、斯洛伐克语、斯洛文尼亚语和索不语。 ? ISO 8859-3 包括:世界语、马耳他语和土耳其语。 ? ISO 8859-4 现在不推荐使用,新应用应该采用 ISO 8859-10 或者 ISO 8859-13。 ? ISO 8859-5 ? ISO 8859-6 ? ISO 8859-7

? ISO 8859-8 ? ISO 8859-9 ? ISO 8859-10 ? ISO 8859-11 ? ISO 8859-13 ? ISO 8859-14 ? ISO 8859-15 在 ISO8859 的编码表中,编号 0 – 127 与 ASCII 保持兼容,编号 128 – 159 共 32 个 编码保留给扩充定义的 32 个扩充控制码,160 为空格, 161 -255 的 95 个数字用于新增 加的字符代码。 编码的布局与 ASCII 的设计思想如出一辙, 由于在一张码表中只能增加 95 种字符的代码,所以 ISO8859 实际上不是一张码表,而是一系列标准,包括 14 个字符码 表。 例如, 西欧的常用字符就包含在 ISO8859-1 字符表中。 ISO8859-7 种则包含了 ASCII 在6
和现代希腊语字符。 问题出现了! ISO 的 8859 标准解决了大量的字符编码问题,但也带来了新的问题,比如说,没有办 法在一篇文章中同时使用 ISO8859-1 和 ISO8859-7,也就是说,在同一篇文章中不能同时 出现希腊文和法文,因为他们的编码范围是重合的。例如:在 ISO8859-1 中 217 号编码表 示字符 ù ,而在 ISO8859-7 中则表示希腊字符Ω,这样一篇使用 ISO8859-1 保存的文件, 在使用 ISO8859-7 编码的计算机上打开时,将看到错误的内容。为了同时处理一种以上的 文字,甚至还出现了一些同时包含原来不属于同一张码表的字符的新码表。
16.2.3. GB2312不管如何, 欧洲的拼音文字都还可以用一个字节来保存, 一个字节由 8 个二进制的位组 成,用来表示无符号的整数的话,范围正好是 0 – 255。 但是,更严重的问题出现在东方,中国,朝鲜和日本的文字包含大量的符号。例如,中国的 文字不是拼音文字, 汉字的个数有数万之多, 远远超过区区 256 个字符, 因此 ISO 的 8859 标准实际上不能处理中文的字符。 通过借鉴 ISO8859 的编码思想,中国的专家灵巧的解决了中文的编码问题。 既然一个字节的 256 种字符不能表示中文,那么,我们就使用两个字节来表示一个中文, 在每个字符的 256 种可能中,低于 128 的为了与 ASCII 保持兼容,我们不使用,借鉴 ISO8859 的设计方案,只使用从 160 以后的 95 个数字,两个字节分成高位和低位,高位 的取值范围从 176-247 共 72 个,低位从 161 – 254 共 94 这样,两个字节就有 72 * 94 = 6768 种可能,也就是可以表示 6768 种汉字,这个标准我们称为 GB2312-80。 6768 个汉字显然不能表示全部的汉字,但是这个标准是在 1980 年制定的,那时候,计算机 的处理能力,存储能力都还很有限,所以在制定这个标准的时候,实际上只包含了常用的汉 字,这些汉字是通过对日常生活中的报纸,电视,电影等使用的汉字进行统计得出的,大概 占常用汉字的 99.75%。因此,我们时常会碰到一些名字中的特殊汉字无法输入到计算机中 的问题,就是由于

这些生僻的汉字不在 GB2312 的常用汉字之中的缘故。 由于 GB2312 规定的字符编码实际上与 ISO8859 是冲突的, 所以, 当我们在中文环境下看 一些西文的文章, 使用一些西文的软件的时候, 时常就会发现许多古怪的汉字出现在屏幕上, 实际上就是因为西文中使用了与汉字编码冲突的字符, 被我们的系统生硬的翻译成中文造成 的。 不过,GB2312 统一了中文字符编码的使用,我们现在所使用的各种电子产品实际上都是基 于 GB2312 来处理中文的。 GB2312-80 仅收汉字 6763 个,这大大少于现有汉字,随着时间推移及汉字文化的不断延伸 推广, 有些原来很少用的字, 现在变成了常用字, 例如: 朱镕基的 “镕” 未收入 GB2312-80, 字, 现在大陆的报业出刊只得使用(金+容)(金容)(左金右容)等来表示,形式不一而同, 、 、 这使得表示、存储、输入、处理都非常不方便,而且这种表示没有统一标准。 为了解决这些问题, 全国信息技术化技术委员会于 1995 年 12 月 1 日 《汉字内码扩展规范》 。 GBK 向下与 GB2312 完全兼容,向上支持 ISO 10646 国际标准,在前者向后者过渡过程中 起到的承上启下的作用。GBK 亦采用双字节表示,总体编码范围为 8140-FEFE 之间,高字 节在 81-FE 之间,低字节在 40-FE 之间,不包括 7F。在 GBK 1.0 中共收录了 21886 个符7
号,汉字有 21003 个。 GBK 共收入 21886 个汉字和图形符号,包括: * GB2312 中的全部汉字、非汉字符号。 * BIG5 中的全部汉字。 * 与 ISO 10646 相应的国家标准 GB13000 中的其它 CJK 汉字,以上合计 20902 个汉字。 * 其它汉字、部首、符号,共计 984 个。 微软公司自 Windows 95 简体中文版开始支持 GBK 代码。 GBK 编码区分三部分: * 汉字区 包括 GBK/2 :0xBOA1-F7FE, 收录 GB2312 汉字 6763 个,按原序排列; GBK/3 :0x8140-AOFE,收录 CJK 汉字 6080 个; GBK/4 :0xAA40-FEAO,收录 CJK 汉字和增补的汉字 8160 个。 * 图形符号区 包括 GBK/1 :0xA1A1-A9FE,除 GB2312 的符号外,还增补了其它符号 GBK/5 :0xA840-A9AO,扩除非汉字区。 * 用户自定义区 即 GBK 区域中的空白区,用户可以自己定义字符。 GB18030 是最新的汉字编码字符集国家标准, 向下兼容 GBK 和 GB2312 标准。GB18030 编码是一二四字节变长编码。 一字节部分从 0x0~0x7F 与 ASCII 编码兼容。二字节部分, 首字节从 0x81~0xFE, 尾字节从 0x40~0x7E 以及 0x80~0xFE, 与 GBK 标准基本兼容。 四 字节部分, 第一字节从 0x81~0xFE, 第二字节从 0x30~0x39, 第三和第四字节的范围和前两 个字节分别相同。
16.2.4. 不一样的中文中文的问题好像也解决了,且慢,新的问题又来了。 中国的台湾省也在使用中文,但是由于历史的原因,那里没

有使用大陆的简体中文,还在使 用着繁体的中文, 并且他们自己也制定了一套表示繁体中文的字符编码, 称为 BIG5,不幸的 是,虽然他们的也使用两个字节来表示一个汉字,但他们没有象我们兼容 ASCII 一样兼容 大陆的简体中文, 他们使用了大致相同的编码范围来表示繁体的汉字。 同样的编码在大陆和 台湾的编码中实际上表示不同的字符, 大陆的玩家在玩台湾的游戏时, 经常会遇到乱码的问 题,问题根源就在于,大陆的计算机默认字符的编码就是 GB2312, 当碰到台湾使用 BIG5 编码的文字时,就会作出错误的转换。 由于历史和文化的原因,日文和韩文中也包含许多的汉字,象汉字一样拥有大量的字符,不 幸的是, 他们的字符编码也同样与中文编码有着冲突, 日文的游戏在大陆上一样也会出现无 法理解的乱码。 《中文之星》《南极星》《四通利方》就是用于在这些编码中进行识别和转 , , 换的专用软件。 互联的时代
8
在二十世纪八十年代后期,互联网出现了,一夜之间,地球村上的人们可以直接访问远在天 边的服务器,电子文件在全世界传播,在一切都在数字化的今天,文件中的数字到底代表什 么字?这可真是一个问题。
16.2.5. UNICODE实际上问题的根源在于我们有太多的编码表。 如果整个地球村都使用一张统一的编码表, 那么每一个编码就会有一个确定的含义, 就不会 有乱码的问题出现了。 实际上, 80 年代就有了一个称为 UNICODE 的组织, 在 这个组织制定了一个能够覆盖几乎 任何语言的编码表,在 Unicode3.0.1 中就包含了 49194 个字符,将来,Unicode 中还会增 加更多的字符。Unicode 的全称是 Universal Multiple-Octet Coded Character Set ,简称为 UCS。 由于要表示的字符如此之多,所以一开始的 Unicode1.0 编码就使用连续的两个字节也就是 一个 WORD 来表示编码,比如“汉”的 UCS 编码就是 6C49。这样在 Unicode 的编码中 就可以表示 256*256 = 65536 种符号了。 直接使用一个 WORD 相当于两个字节来保存编码可能是最为自然的 Unicode 编码的方 式,这种方式被称为 UCS-2,也被称为 ISO 10646, ,在这种编码中,每一个字符使用两个 字节来进行表示,例如, “中” 使用 11598 来编码,而大写字母 A 仍然使用 65 表示, 但它占用了两个字节,高位用 0 来进行补齐。 由于每个 WORD 表示一个字符,但是在不同的计算机上,实际上对 WORD 有两种不同的 处理方式,高字节在前,或者低字节在前,为了在 UCS-2 编码的文档中,能够区分到底是 高字节在前,还是低字节在前,使用 UCS-2 的文档使用了一组不可能在 UCS-2 种出现的 组合来进行区分,通常情况下,低字节在前

,高字节在后,通过在文档的开头增加 FFFE 来 进行表示。高字节在前,低字节在后,称为大头在前,即 Big Endian,使用 FFFE 来进行 表示。这样,程序可以通过文档的前两个字节,立即判断出该文档是否高字节在前。 Endian 这个词出自《格列佛游记》小人国的内战就源于吃鸡蛋时要先吃大头 big endian 还 , 是小头 little-endian,并由此发生了内战。
16.3. 现实中的 Unicode 16.3.1. UCS-2 面临的问题UCS-2 虽然理论上可以统一编码,但仍然面临着现实的困难。 首先,UCS-2 不能与现有的所有编码兼容,现有的文档和软件必须针对 Unicode 进行转换 才能使用。即使是英文也面临着单字节到双字节的转换问题。 其次, 许多国家和地区已经以法律的形式规定了其所使用的编码, 更换为一种新的编码不现
9
实。比如在中国大陆,就规定 GB2312 是大陆软件、硬件编码的基础。 第三,现在还有使用中的大量的软件和硬件是基于单字节的编码实现的,UCS-2 的双字节 表示的字符不能可靠的在其上工作。
16.3.2. 新希望 UTF-8为了尽可能与现有的软件和硬件相适应, 美国人又制定了一系列用于传输和保存 Unicode 的 编码标准 UTF,这些编码称为 UCS 传输格式码,也就是将 UCS 的编码通过一定的转换, 来达到使用的目的。常见的有 UTF-7,UTF-8,UTF-16 等。 其中 UTF-8 编码得到了广泛的应用,UTF-8 的全名是 UCS Transformation Format 8, 即 UCS 编码的 8 位传输格式,就是使用单字节的方式对 UCS 进行编码,使 Unicode 编码能 够在单字节的设备上正常进行处理。 UTF-8 编码是变长的编码,对不同的 Unicode 可能编成不同的长度 UCS-2 0000-007F 0- 127 0080-07FF 128- 2047 0800-FFFF 2048-65535 UTF-8 0xxxxxxx 110xxxxx 10xxxxxx 1110xxxx 10xxxxxx 10xxxxxx
例如 1 的 Unicode 编码是 31 00,在 0-127 之间,所以转换后即为 31,而“中”字的 UTF-8 Unicode 编码为 11598,转换成 UTF-8 则为 e4 b8 ad。 实际上,ASCII 字符用 UTF-8 来表示后,与 ASCII 是完全一样的,美国人又近水楼台的 把自己的问题解决了。但其他的编码就没有这么幸运了。 UNICODE 中的中文 Code point range Block U+3400..U+4DB5 U+4E00..U+9FA5 U+9FA6..U+9FBB U+F900..U+FA2D U+FA30..U+FA6A U+FA70..U+FAD9 U+20000..U+2A6D6 U+2F800..U+2FA1D name Release CJK Unified Ideographs Extension A 3.0 CJK Unified Ideographs 1.1 CJK Unified Ideographs 4.1 CJK Compatibility Ideographs 1.1 CJK Compatibility Ideographs 3.2 CJK Compatibility Ideographs 4.1 CJK Unified Ideographs Extension B 3.1 CJK Compatibility Supplement 3.1
突破障碍 - Unicode 与 本地编码的转换 UTF-8 编码解决了字符的编码问题,又可以在现有的设备上通行,因此,得到了广泛的使 用,
10
16.4. 应用中的 Unicode
16.4.1. 记事本中的 UnicodeXML 的设

计目标是实现跨网络,跨国界的信息表示,所以,在 XML 设计之初,就规 定 XML 文件的默认编码格式就是 UTF-8,也就是说,如果没有特殊的说明,XML 文件将 被视为 UTF-8 编码。 然而,大部分的中文编辑软件,是根据操作系统来决定编码的方式的,所以,在写字板中直 接输入并保存的文件,将被保存为 GB2312 编码,所以,在读出 XML 文件内容时,往往 就会出现文件错误的提示了。这种情况会出现在文件中有中文出现的时候,如果没有中文, 只有英文信息, 就不会出现问题。 原因很简单, 有中文时, 因为中文的编码并不是 UTF-8 编 码,所以会造成冲突,没有中文时,英文的编码在 GB2312 中与 ASCII 是兼容的,而 ASCII 与 UTF-8 是完全一致的,所以不会出现问题。这种情况也包括 UltraEdit 软件。 但时,专业的 XML 编辑软件会自动将内容保存为 UTF-8 编码,不会有问题。 在通过 DOM 或 XSLT 保存 XML 文件时也有着同样的问题。 默认情况下,XML 的处理程序一般会将内容作为 UTF-8 编码进行处理,所以保存下来的 XML 文件必须要用可以识别 UTF-8 的软件来进行查看,如 Windows 的记事本。
16.4.2.
Java 的处理
Java 的设计目标是一次编写, 到处运行, 所以在 Java 的内部对字符的处理采用了 UCS 来 处理, 因此 Java 的字符类型不再是 C++ 中的一个字节, 而使用两个字节来保存一个字符。 但是, 我们会发现, Java 的文件流中保存为文件后, 在 我们可以直接使用记事本或 UltraEdit 打开察看。 在这里,Java 采用了一个灵巧的默认转换机制,当需要将内容中的字符保存到文件中时, Java 会自动的查看一下系统的本地编码,系统的本地编码可以在控制面板中查到,然后, 自动将 UCS 编码的字符转换为本地编码, 并进行保存。当需要从系统的文件系统中读入一 个文件时,Java 通过查看系统的本地编码来决定如何识别文件的内容。这样,Java 就可以 在内部使用 UCS, 但用户可以直接使用本地编码的文件了。 Java 在相应的方法中,提供了额外的参数,可以让用户自己来指定文件的编码。
16.4.3.
.Net 的处理
在微软的 .Net 内部,同样使用 UCS 编码,但是,在对文件进行处理的时候,与 Java 有一些区别,.Net 不查询系统的本地编码,而是直接使用默认的 UTF-8 编码进行文件的处 理,所以,你保存的中文内容,在 UltraEdit 中可能就是乱码,但是,如果你使用记事本打 开的话,就不会有问题,因为 Windows 的记事本可以识别 UTF-8 的编码。 .Net 软件的配置文件使用 XML 格式,默认的编码一样是 UTF-8 ,所以,必须使用可以 识别 UTF-8 的软件进行处理,如:786d1966b84ae45c3b358c81,记事本等。11
在 .Net 中,网

页默认处理编码就是 UTF-8。
16.4.4.
Web 中的编码问题
网页的编码问题主要有两点,一是网页是如何编码的,二是如何告诉浏览器如何编码的。 第一个问题,又可以分成静态页面和动态页面两个问题。 对静态页面, 网页的编码要看你保存文件时的编码选项, 多数的网页编辑软件可以让你选择 编码的类型, 默认为本地编码, 为了使网页减少编码的问题, 最好保存为 UTF-8 编码格式。 对 动 态 页 面 , 如 Servlet 生 成 的 页 面 , 在 HttpServletResponse 类 中 有 一 个 方 法 setContentType , 可 以 通 过 参 数 来 指 定 生 成 的 页 面 的 类 型 和 编 码 , 例 如 : response.setContentType("text/html; charset=utf-8");来指定生成的页面的编码类型。 对 jsp 页面可以通过 <%@ page contentType="text/html;charset=gb2312" %> 来指定生成的 页面的编码及类型。 第二个问题,如何通知浏览器网页的编码类型。 浏览器收到只是一个字节流,它并不知道页面是如何编码的,因此,需要一个机制来告诉浏 览器页面的编码类型, 标准的机制是使用 来指定页面的编码,当浏览器读取页面遇到这样的指示时,将使用这里制定 的编码方式重新加载页面。 否则的话,浏览器将会试图猜出页面的编码类型。 Tomcat 中的中文问题 在 Tomcat 中,经常遇到取回客户端提交的信息是乱码的问题。 当提交表单的时候,HTML 页面的 Form 标签会使情况变得更为复杂。浏览器的编码方式取 决于当前页面的编码设定,对 Form 标签也照此处理。这意味着如果 ASCII 格式的 HTML 页面用 ISO-8859-1 编码,那么用户在此页面中将不能提交中文字符。所以,如果你的页面 使用的是 utf-8,那么 POST 的时候,也将使用 utf-8 。 由于 Tomcat 是美国人设计的,Tomcat 默认使用 ISO8859-1 编码队客户端返回的内容进行 解码,由于编码与内容不一致,就会出现乱码的 ??? 出现,根据以上的分析,在服务器端 读取客户端回送的内容时,需要首先设定回送内容的编码,然后再进行信息的读取,通过使 用 HttpServletRequest 的方法 setCharacterEncoding("utf-8")先行设定信息的编码类型。然 后,就可以正确读取内容了。
16.5. 总结编码问题是信息处理的基本问题, 事实上存在着大量不统一的编码方式, 造成在信息处理过 程中的信息丢失,转换错误等问题,UCS 为问题的解决提供了一个很好的方向,但是,在 现在的软件环境中,还没有达到全面地使用。在实际中工作中应尽量采用统一的编码格式, 减少编码问题的发生
12
16.6. .NET 中的字符编码 16.6.1. C# 中的 char 数据类型MSDN 中如下定义:char 关键字用于声明下表

所示范围内的 Unicode 字符。Unicode 字符 为 16 位字符,用于表示世界上多数已知的书面语言。 U+0000 到 U+ffff 在程序中可以使用 \u 前导符号表示 Unicode 编码,例如: char c = ‘\u0058’;
16.6.2. Encoding 类定义在 System.Text 命名空间中的 Encoding 类是一个抽象类,定义了字符编码。 定义如下: public abstract class Encoding : ICloneable 编码是一个将一组 Unicode 字符转换为一个字节序列的过程。解码是一个反向操作过程, 即将一个编码字节序列转换为一组 Unicode 字符。 抽象类中定义了如下的常用方法: ? public virtual int GetByteCount ? public virtual int GetMaxByteCount 度比较快 ? public virtual byte[] GetBytes ? public virtual int GetCharCount 生的字符数 ? public virtual int GetMaxCharCount 符数,速度较快 ? public virtual char[] GetChars ? public virtual string GetString
计算对指定字符进行编码所产生的字节数 计算对指定字符进行编码所产生的最大字节数, 速 将指定的字符编码为一个字节序列 计算对指定字节数组中的所有字节进行解码所产 计算对指定数组的字节进行解码所产生的最大字 将指定字节数组中的所有字节解码为一组字符 将指定字节数组中的所有字节解码为一个字符串
16.6.3. 常用的编码实现ASCII 编码 定义为 public class System.Text.ASCIIEncoding : Encoding13
ASCIIEncoding 仅支持 U+0000 到 U+007F 之间的字符值,对应于代码页 20127。 UTF8 编码 定义为 public class UTF8Encoding : Encoding 表示 Unicode 字符的 UTF-8 编码。 UTF-8 编码为不定长编码,将每个码位表示为 1 到 4 个字节组成的序列,其中对于每个 ASCII 字符编码为一个字节,对于简体中文将编码为两个字节。 UTF-8 的代码页为 65001,前导符为 EF BB BF。 GB2312 编码 .NET 类库中没有预定义的 GB2312 编码类,需要通过 Encoding 的静态方法 GetEncoding 获得,这个方法有多个重载,我们通常使用代码页或者编码的名称来取得编码对象。 System.Text.Encoding gbk = System.Text.Encoding.GetEncoding( 936 ); 或者 System.Text.Encoding gbk = System.Text.Encoding.GetEncoding( “gb2312” );
16.6.4. 字符流在 .NET 中字符流分为两种,字符输入流和字符输出流。 字符输入流的基类为 TextReader,定义如下: public abstract class TextReader : MarshalByRefObject, IDisposable 其中定义的常用方法为: ? ? ? ? ? public virtual int Peek() 预读下一个字符, 但是并不实际从流出进行读取, 不会改变 读取器的状态。返回下一个要读取的字符,如果没有更多字符可读,则返回 -1。 public virtual int Read() 读取下一个字符,返回读取的字符,如果没有字符可读,返 回 -1。 public virtual string ReadLine() 读取流中的一行,如果没有字符可读,返回 null。 pub

lic virtual string ReadToEnd() 读取从当前位置直到结尾的所有字符。 public virtual int ReadBlock 读取一块的字符, 保存到内存中字符数组中, 第一个参14
数为字符数组的引用, 第二个参数为在数组中保存的起始下标, 第三个参数为最多读取 的字符数量。方法返回值为实际读取的字符数。 经常使用的派生类为 StreamReader,定义如下: public class StreamReader : TextReader StreamReader 可以以一种特定的编码输入字符内容,除非特殊指定,StreamReader 的默认 编码为 UTF-8,而不是操作系统当前的代码页,如果需要读取的字符内容不是使用 UTF-8 编码,那么,可以在构造函数中传递实际的编码类型。 例如: System.IO.StreamReader reader = new System.IO.StreamReader( “hello.txt”, System.Text.Encoding.UTF8 ); 字符输出流的基类为 TextWriter,定义如下: public abstract class TextWriter : MarshalByRefObject, IDisposable 其中定义的常用方法为: ? public virtual Write( char ch ) 将字符写入字符流 ? public virtual WriteLine( string ) 将字符串写入到字符流中 常用的实现类: 字符输出流 StreamWriter ,定义如下: public class StreamWriter : TextWriter StreamWriter 的默认编码为 UTF8,可以在构造函数中传递特定的编码对象。常见构造函数 定义为: public StreamWriter( string path, bool append, Encoding encoding) 例如:创建一个 UTF8 编码的字符流 System.IO.TextWriter writer = new System.IO.StreamWriter( “hello.txt”, false, System.Text.Encoding.UTF8 );
15
第 17 天 XML,DTD,Schema工欲善其事,必先利其器。 XML,可扩展标记语言(eXtensible Markup Language) ,是 W3C(万维网联盟)认可的文 档标记标准。它定义了利用简单的、人类可读的标签对数据进行标记所采用的语法。提供了 计算机文档的一种标准格式。 XML 是用来描述数据的一种格式,这种格式使用简单的,易读的文本进行描述,可以用来 描述无穷无尽的类型的数据。 XML 仅仅是一种标记语言,这一点非常重要。首先,XML 不是编程语言,虽然可以使用 XML 的格式来写各种程序,它仅仅是一种描述数据的格式。其次,XML 不是网络传输协 议。但是,可以通过 FTP,HTTP 等等协议来传输以 XML 格式描述的数据。最后,XML 不是数据库。由于可以通过 XML 来描述数据,所以这一点常常会造成混淆。我们通常所 说的数据库包括数据管理软件和所管理的数据,记住,XML 仅仅是描述数据的格式。 那么,XML 仅仅那么简单么? 水是不是也非常简单?
17.1. XML 的简单历程20 世纪 70 年代,IBM 公司的 Charles Goldfarb、Ed Mosher 和 Ray Lorie 开发了最终称为 SGML 的语言 ( Standard Generalized Markup Language,标准通用标记语言)。这种语言经过 全世界数百人的开

发,直到 1986 年被 ISO 采用为 8879 标准。 SGML 的主要问题是太复杂。一份正式的 SGML 规范长达 150 多页。 SGML 最重要的成功应用是 HTML,然而,HTML 仅仅是 SGML 的一种应用,HTML 对 于创建网页很成功,但是其作用仅限于此。 1998 年 2 月,通过对于 SGML 的“精简” ,诞生了 XML 1.0 ,并且很快取得了成功。
17.2. XML 的结构可以从三个角度看 XML ? 通过文本描述 ? 明确的编码 ? 层次的标记语言
16
17.2.1. 通过文本描述XML 的内容通过文本表示出来,而不是使用二进制的方式进行描述。这使得 XML 非常便 于书写、传递、阅读。
17.2.2. 明确的编码由于在计算机中处理的所有内容都是数字,包括文本,那么,这些数字是如何被解释为文本 的呢?答案是通过某种字符编码格式。XML 文件的本文是通过明确的标码格式进行定义 的,因此,可以保证被正确的解读出来。 通常情况下,在 XML 文件的第一行,使用 进行定 义。其中 version 表示所使用的 XML 的版本,encoding 用来声明本 XML 文件所使用的 字符编码格式。 由于目前 XML 只有 1.0 版本, 所以, 默认情况下, 版本就是 1.0, encoding 属性默认值为 UTF-8,所以,也有许多 XML 文件没有特别指定 encoding ,表示使用的 是 UTF-8 编码。还有一些 XML 文件没有在第一行给出定义,则表示使用默认的定义,即 version 为 1.0,ecnoding 为 UTF-8。
17.2.3. 层次的标记语言XML 使用层次的标记语言来表述数据信息。 层次化的标记语言可以非常方便地描述层次化的数据,标记语言可以对数据进行说明。 XML 文档是一颗树。
17
17.2.4. XML 文件的一些特点:区分大小写 属性必须使用引号引起来,在 XML 中使用单引号和使用双引号引起来的内容都是字符内 容,没有区别。 下面看一个 XML 文件 XML 彻底研究 张三 共有七种组成元素可以出现在 XML 文件中 1. 第一行出现的称为 XML 的定义,用来说明本 XML 文件的版本和编码信息。当前所 有的 XML 版本都是 1.0 。encoding 用来指定 XML 文档的编码格式。 最重要的是元素,元素是整个 XML 文件的主要架构。元素是通过标记进行定义的,整 个元素由三部分组成,元素的开始标记,元素的结束标记,其他包含在元素开始标记和 结束标记之间的内容。 我们通常使用标记的名称来做为元素的名称。 没有包含内容的元 素称为空元素。空元素可以简写为 <元素名称/>。 例如:张三 author 为元素的标记名,同时也是标记的名称,张三为元素的内容。 没有名字的

作者可以如下表示: 3. 属性:写在元素的开始标记中的名值对,称为属性,名值之间通过等号 (=) 进行分隔, 等号前面为属性的名称, 等号后面为属性的值。 属性的值必须使用引号引起来, XML 在 中不区分单引号和双引号的作用,但必须同时使用单引号或者双引号,不能交叉使用。 如: code 为元素 book 的属性,code 属性的值为 F1234 同一个元素的开始标记中可以有多个属性,多个属性之间通过空白分开,但是,不能有 同名的属性。
2.
18
4.
文本内容,在 XML 中,在元素标记之间的内容称为文本内容,文本内容只有值,没 有名称,用来表示元素的值。 例如:张三 张三为元素 author 元素的文本内容。 在 XML 中可以使用字符引用来通过字符编码表示字符。 字符引用如果使用十进制的数字表示,格式为 &#十进制数字; 例如 њ。 字符引用如果使用十六进制的数字表示,格式为 &#x 十六进制数字;,注意多了一个 x
5.
实体参考,由于在 XML 使用了一些特殊的符号,总共有 5 种符号: < ,>,” , ‘, &, 因此在书写 XML 的时候使用这些符号会导致其含义被误解, 为了能够在 XML 的 内容中使用这 5 种符号,XML 预定义 5 种实体来代表这 5 种符号。 lt < gt > amp & quot “ apos ‘ 但是,直接写这些符号也会导致混乱,所以在使用这些符号的时候,必须在实体的前面 加上 &,后面加上分号 ( ; ) 来特别表示。因此在使用中出现的形式为: < > & " ' < > & “ ‘
6.
注释:XML 的注释和 HTML 的注释一样,使用 例如: CDATA CDATA 就是 Character Data 的意思,也就是不需要用 XML 解析器处理的 内容,例如在 XML 文件中程序代码等,要按照规定格式使用 例如: PI 处理指令 用来在 XML 文件中包含应用程序命令,格式为 例如: 其中 xml-stylesheet 为处理指令的名称,type=’text/xsl’ href=’book.xslt’ 为处理指令的 值。
7.
8.
19
在 XML 中,最重要的内容为元素,属性和文本内容。
17.3. XML 结构的定义虽然根据 XML 的基本规则就可以写出 XML 文档,但是,如果大家都自由随意地书写 XML,那么,这些数据还是很难以进行交流的。 为了规范 XML 的结构,先后制定了两种定义 XML 结构的规范: ? DTD ? XML Schema
17.4. DTD在 XML 创建的早期,为了解决 XML 结构定义的问题,直接采用了 SGML 中的定义部 分,这个技术称为 DTD( document type definition) 。 DTD 用于定义 XML 文件的结构,既可以在 XML 文件内部定义 XML 文件的架构,也 可以在一个

专用的文件内定义 DTD ,然后用于检查 XML 是否符合定义的架构。 在 XML 文件内定义的形式如下: 在 XML 文件外部的专用文件内定义 DTD 时, XML 文档内必须包含 DTD 的引用,此引用 在文档的唯一文档类型声明中给出。使用这种方式时,需要在 XML 的定义中进行声明, 例如: 不过,即使在不需要的情况下,将 standalone 设置为 no 也没有关系,此设置可选,默认 为 no。 文档类型定义有两种写法: 此 声 明 指 出 文 档 的 根 元 素 为 person , 并 且 该 文 档 的 定 义 “786d1966b84ae45c3b358c81/xml/person.dtd” 找到。
DTD 可 以 在
另外一种写法更常在网页上看到,例如,在网页的开始,常常有如下的定义: 20
Strict//EN”
此声明表示文档的根元素为 html,使用 W3C 的名为 -//W3C//DTD XHTML 1.0 Strict//EN 的网页标准,此标准可以在 786d1966b84ae45c3b358c81/TR/xhtml/DTD/xhtml1-strict.dtd 找到。 PUBLIC 表示这是一个公用标准,后面紧跟着的为标准的 ID。这个 ID 唯一的标识了这个 公用标准,一般来说,使用这个标准的程序往往备份了这个标准,这样,即使在不能联网的 情况下,也可以使用这个标准。
17.4.1. 定义不包含内容的元素不包含内容的元素称为 EMPTY 下面的例子使用包含在 XML 文件内的 定义方式进行定义 用来指定 dtd 的定义,book 表示 XML 文件的根元素是 book, 在其中间的就是对文件的详细定义了。
EMPTY >
17.4.2. 定义包含文本内容的元素以下为简单的 XML 文件 轻松学习 XML 可以如下定义 ]> 轻松学习 XML 21
每一个元素如下定义 !ELEMENT 表示要定义元素,后面的圆括号中是元素的定义内容,#PCDATA 表示已经进 行解析的文本内容,而且不包含任何类型的子元素
17.4.3. 定义包含有子元素的元素 轻松学习 XML ]> 轻松学习 XML 增加了如下一行 元素名称后面的圆括号内用来表示元素的内容。此时表示 booklist 元素有一个 book 子元 素。 然后依次定义子元素的类型,定义同前。
17.4.4. 多个子元素的定义

rsion="1.0" encoding="UTF-8"?>
22
]> 1234 轻松学习 XML 多个子元素时,在元素的定义中,依次定义子元素,子元素之间用逗号 ( , ) 分隔。逗号表 示子元素出现的先后顺序。在 XML 文件中子元素的使用顺序必须同定义的顺序
17.4.5. 如何控制子元素出现的次数可以在子元素的后面增加控制符号 ? 表示出现 0 次或 1 次 * 表示出现 0 次或多次 + 表示出现 1 次或多次 没有控制符号表示必须出现 1 次 | 表示子元素可选
17.4.6. 数据类型的定义前面我们一直使用 #PCDATA 来定义元素的数据内容,其他还有: EMPTY 表示 空元素,没有数据内容 #PCDATA 表示文本数据的字符串 ANY 表示元素内容可以属于任何数据 在 DTD 中,没有整数,小数,日期,字符串的概念。
23
17.4.7. 属性的定义定义属性使用如下语法 属性类型有如下十种 CDATA 文本数据字符串 ID 表示唯一的一个号码,而且在整个 XML 文件中不可重复,必须以字母开头 IDREF 表示使用其他元素属性的 ID 值 IDREFS 表示使用多个其他元素的 ID 值, 多个 ID 值时,使用空格进行分隔. ENTITY 表示使用预定义好的实体,实体就是定义好名字的一个内容 ENTITYS 表示使用预定义好的一组实体, 实体就是定义好名字的一个内容, 使用空 格分隔 NMTOKEN 关键字的名称,包括字母,数字,和 _ . - : NMTOKENS 关键字的名称,包括字母,数字,和 _ . - : 使用空格进行分隔 NOTATION 参考的标记声明 (value | value) 选择一个或多个 NMTOKEN 的值 还有一个 xml: DTD 默认的属性 DTD 的默认属性有两个: xml:space xml:lang 取值可以是 default 和 presever, 控制空格的处理 指定元素所使用的语言 大陆:zh-CN 台湾:zh-TW
由于可能在 XML 文件中使用多种编码,所以可以在元素的标记中通过 xml:lang 指定此元 素所使用的语言,语言通常使用一个两个字符的代码进行表示,这些代码定义在 ISO 639 中。 但是,一些时候,仅仅知道所采用的语言还不够,例如,中文在中国大陆和中国台湾有不同 的用法,所以我们还需要知道在哪个地区讲该语言。为了处理这些差别,语言代码后可以跟 随任何子代码编号,以进一步指定所采用的语言。如果语言代码为一个 ISO 639 代码,则 子代码应该是一个两个字母的国家代码,定义在 ISO 3166 中。 语言代码通常小写,国家代码通常采用大写。然而,这只是一种习惯,并非规定。 可以定义同时定义多个属性 属性可以有可选的选项,对属性进行说明 #IMPLIED 表示可选的属性 #REQUIRED 表示

必须的属性24
#FIXED
固定的属性,用户不可更改
例如,下面的例子中 book 元素有一个 no 的属性,此属性为必写属性。 1234 轻松学习 XML
#REQUIRED >
后面的内容不经常使用,为选读内容。
17.4.8. 实体实体就是语言中的常数,主要用来定义一些重复和常用的文字内容 例如:将公司名称定义为实体 &corp; 通过在实体前加上 &, 后面加上; 来使用 如果实体是在外面文件中定义的话 如果不是文本内容,是二进制的文件,需要说明二进制文件的类别25
"国际图书发行公司">
参数实体用在 DTD 文件中,将常用的内容定义,以便以后使用 通过在实体名称前增加 % 来定义 使用时实体变量时,在变量的前面加上 %, 后面加上 ;
17.4.9. DTD 的标记用来声明外部的非 XML 数据,以便应用程序知道如何进行处理
17.4.10. 单独文件的 DTDDTD 的定义内容也可以保存在单独的文件中,称为 DTD 文件,一般这类文件的扩展名为 DTD。 例如,上面的例子也可以保存为两个文件 DTD 文件 booklist.dtd #REQUIRED >
XML 文件 booklist.xml 123426
轻松学习 XML
SYSTEM 后面为 DTD 文件的绝对或者相对路径。
17.4.11. 公共的 DTD有一些公共定义的 DTD 可以直接使用,例如,在 xml 诞生之后,W3C 定义了基于 XML 的 xHTML 规范,对 HTML 的书写进行了更为严格的限制,这个限制有两个规范组成。 Strict 为严格的规范 Transitional 为过渡规范 这两个规范都采用 DTD 进行定义。 在使用中, 在需要进行检查的网页前声明 DTD 的定义, 786d1966b84ae45c3b358c81 中, 在 每一个 .ASXP 文 件的开头部分都为 上面的声明中,PUBLIC 表示公共定义,后面的 -//W3C//DTD XHTML 1.0 Transitional//EN 为定义的名称。最后一部分为定义的网址。 对于 IE 浏览器,当网页中包含这个定义的时候,工作在标准模式,浏览器的行为会尽可能 靠近 W3C 的规范。没有这个定义的时候,工作在怪异模式。也就是 IE 的默

认工作方式 中。可能与 W3C 的定义不一致。所以我们的网页一定要在开头加上这个定义。
17.5. Xml Schema由于 DTD 不适专门用来定义 XML 的规范,而是从 SGML 借用的规范,所以,在 XML 中一方面使用 DTD 进行定义,另一方面,也开始了寻找更加适合 XML 的架构定义规范。 Xml Schema 为 W3C 专门为 XML 定义的 XML 架构定义语言,提供了比 DTD 更为强 大的定义能力。 新的 XML 架构定义都已经采用了 Xml Schema 为定义语言。 旧的 DTD 定 定义方式将逐渐被 Xml Schema 所替换掉。 如何写一个最简单的 XML Schema 文档呢?
17.5.1. 定义简单的 Schemahello.xml27
------------------ Hello World!! (一个根元素:greeting;且这个元素不含属性,无子元素,内容是字符串。 ) hello.xsd ---------- XML Schema 文档后缀名是.xsd,完全符合 XML 语法,根元素是 schema,命名空间 xmlns:xsd="786d1966b84ae45c3b358c81/2001/XMLSchema,用元素定义实例文档中的元素, 如 greeting。
17.5.2. XML 的命名空间Xmlns 为 Xml namespace 的简写, XML 命名空间。 XML 中为了保证命名空间的唯 即 在 一性,使用基于域名的命名空间命名方式。上面的 786d1966b84ae45c3b358c81/2001/XMLSchema 即 为命名空间的名称,虽然非常类似于网址,但是实际上在此处表示命名空间的名称。 由于命名空间比较长,所以在 XMLSchema 中经常使用命名空间的简写,xmlns:xsd 中的 xsd 就是这个命名空间的简写形式。
17.5.3. 简单类型和复杂类型在 XMLSchema 中,定义的核心概念就是简单类型和复杂类型 简单类型就是既不包含子元素,也不包含属性的类型。 复杂类型是可能包含子元素,或者可能包含属性的类型 假设实例文档是如下的: customer.xml ---------- teiki No.237, Road Waitan, Shanghai 28
由于 customer 包含子元素 name 和 address,所以为复杂类型。 name 和 address 既没有包含子元素,又没有包含属性,所以为简单类型。 复杂类型必须使用 complexType 进行说明。并声明其中包含的子元素或者属性。 则可以写出以下的 XML Schema 文档: customer.xsd --------------- 实例文档 customer.xml 中,元素含有两个子元素,所以我们在 Schema 文档中采 用 ComplexType 来定义该元素。 sequence 表示子

元素依次出现的顺序。 type 属性用来声明简单元素的类型,在 XMLSchema 中,预定义了多种基本的数据类型, 例如:字符串类型 xs:string,整数类型 xs:integer,布尔类型 xs:Boolean 等等。在 XML 中 没有字符类型。 如果包含更复杂的子类型,则反复使用上面的原则。 这次我们给出一个更加复杂一些的文档: address.xml -------------- Teiki Zhejiang Hangzhou Xilu Road, No.121, 7F 29
为此,我们需要一个更加复杂一点的 Schema 文档: address.xsd ----------------
17.5.4. 通过 ref 简化复杂的 XMLSchema不过,我们还可以采用 ref 元素来重新编写这个 Schema 文档: address2.xsd --------------------- 30
使用 ref 元素可以直接将其指向另一个模块,使文档更加具有可读性。
17.5.5. 定义属性加入实例文档的元素包含属性,怎么办呢? 在 complexType 中,首先定义子元素,然后再定义元素的属性。 customer2.xml -------------- Teiki No.237, Road Waitan, Shanghai 那就这样写 Schema 文档: customer2.xsd ----------------- 31
很简单,在元素定义完成后,再用元素 id。
17.5.6. 定义子元素的数量先看这个简单的订购数据实例文档: order.xml --------

本文来源:https://www.bwwdw.com/article/hqpq.html

Top