kl800.com省心范文网

xml教学笔记

第4 章
4.1、XML 的特征

XML

HTML 是一种主要用于显示的标记语言,在使用过程中人们发现它有以下缺点:首先, HTML 不支持严格的数据合法性检查;其次,它不允许用户定义私有的标记字或属性,这 就无法把数据参数化,也无法从语义上进行数据检查;此外,HTML 不支持结构化数据, 不支持基于数据库模型或面向对象层次的数据结构。 与 HTML 相比,XML 主要有以下特点。 1.XML 是元标记语言 HTML 定义了一套固定的标记,每一种标记都有其特定的含义。XML 与之不同,它是 一种元标记语言,用户可以自定义所需的标记。新创建的标记可在文档类型定义(DTD, Document Type Definition)中加以描述。 2.XML 描述的是结构和语义 XML 标记描述的是文档的结构和意义,而不是显示页面元素的格式。 在 HTML 文档中,<B>就是一种格式化标记,它使其中的内容变为粗体。 <STRONG>是一种语义标记,意味内容特别重要。 <TD>是结构标记,指明内容是表中的一个单元。 例如,用 HTML 定义的一首歌曲,它包含歌曲的标题、作者等信息。HTML 中使用的 标签也许没有一件是与音乐有关的,清单如下: <dt>Hot Cop <dd> by Jacques Morali Henri Belolo and Victor Willis <ul> <li>Producer: Jacques Morali <li>Publisher: PolyGram Records <li>Length: 6:20 <li>Written: 978 <li>Artist: Village People </ul> 而在 XML 中,同样的内容可以标记为清单如下: <SONG> <TITLE>Hot Cop</TITLE> <COMPOSER>Jacques Morali</COMPOSER> <COMPOSER>Henri Belolo</COMPOSER> <COMPOSER>Victor Willis</COMPOSER> <PRODUCER>Jacques Morali</PRODUCER> <PUBLISHER>PolyGram Records</PUBLISHER> <LENGTH>6:20</LENGTH> <YEAR> 978</YEAR> <ARTIST>Village People</ARTIST> </SONG> 在 XML 文档中使用了自定义的标记,如<SONG>、<TITLE>等。很容易将这些标记与 其代表的意义联系起来。这种用法易于被人阅读,使人能够看出作者的含义。另外,XML

标记具有特定的意义还使得查找文档中的特定信息变得容易很多。 XML 的优点可以简单地归纳为以下几点。 (1) 强大和统一的信息表达能力。 文档、 图片各种多媒体素材等各种信息都可以用 XML 来表示,各种数据均可以采用统一的接口模型提取。 (2) 具有很强的扩展性。 (3) 粒状更新。当其一部分的数据变化后,不需要重发整个结构化的数据,只需要将变 动的元素发送给客户,从而不需要刷新整个使用者的界面就能够显示出来。 (4) 易于处理。XML 对格式的定义非常严格,并具有层次结构,处理起来更加容易。 它是与厂商无关的标准,可以任选一个解析器来处理。 (5) 文档级的内容和显示的分离。XML 定义的数据允许指定不同的显示方式,使得数 据更合理地展现出来并呈现给不同的用户。 (6) 具有很强的链接能力。可以定义双向链接、多目标链接、扩展链接和两个文档间的 链接。 (7) 简便的数据发布方式。由于 XML 是一个开放的基于文本的格式,所以它可以像普 通的 HTML 页面一样更新传送。 HTML 提供了查看数据的通用方法,XML 则提供了直接在数据上工作的通用方法。 XML 的威力在于将用户界面和结构化数据相分离,允许不同来源的数据无缝集成以及对同 一数据的多种处理。从数据描述语言的角度看,XML 是灵活的、可扩展的,有良好的结构 和约束性;从数据处理的角度看,它足够简单而且易于阅读,易于学习,同时也易于被应用 程序处理。 XML 文档的语法 一个格式正规的 XML 文档由三个部分组成:一个可选的序言(Prolog)、文档的主体 (Body)和可选的尾声(Epilog)。一个 XML 文件通常以一个 XML 声明开始,后面通过 XML 元素来组织 XML 数据,XML 元素包括标记和字符数据。标记用尖括号括起来以便与数据 区分开来,尖括号中可以包含一些属性。 为了组织数据更加方便、清晰,我们还可以在字符数据中引入 CDATA 数据块,并可以 在文件中引入注释。此外,由于有时需要给 XML 处理程序提供一些指示信息,XML 文件 中可以包含处理指令。 我们称一个符合 XML 文档语法规范的 XML 文档为“格式正规”的,以下是一份格式正 规的 XML 文档,清单如下: <?xml version="1.0" encoding="GB2312"?> <?xml-stylesheet href="style.xsl" type="text/xsl"?> <!-- 以上是 XML 文档的序言部分 --> <COLLEGE> <TITLE>计算机学院</TITLE> <LEADER>王志东</LEADER> <STU_NUMBER unit="人">3</STU_NUMBER> <STUDENT> <NAME>李文</NAME> <AGE>21</AGE> <SEX>男</SEX> <CLASS>9902</CLASS> 4.2

</STUDENT> <STUDENT> <NAME>张雨</NAME> <AGE>20</AGE> <SEX>女</SEX> <CLASS>9901</CLASS> </STUDENT> <STUDENT> <NAME>刘鹃</NAME> <AGE>19</AGE> <SEX>女</SEX> <CLASS>9903</CLASS> </STUDENT> </COLLEGE> <!-- 以上是文档的主体部分 , 以下是文档的尾声部分 --> 可以看出,XML 文档序言部分从文档的第一行开始,它可以包括: XML 声明、文档类型声明、处理指令等。 文档的主体则是文档根元素所包含的那部分。 XML 尾声部分在文档的末尾,它可以包含注释、处理指令或空白。 1 声明 一个 XML 文件通常以一个 XML 声明作为开始, XML 声明在文件中是可选内容,W3C 推荐加入这一行声明。 XML 声明的作用就是告诉 XML 处理程序:“下面这个文件是按照 XML 文件的标准对 数据进行置标的。”例如,一个最简单的 XML 声明是这样的: <?xml version = "1.0"?> 可以看到,XML 声明由“<?”开始,由“?> ”结束。在“<?”后面紧跟着处理指指令的名称, 在这里是“xml”,XML 这三个字母不区分大小写。 XML 声明中要求必须指定“version”的属性值。同时,声明中还有两个可选属性: “standalone”和“encoding”。因此,一个完整的 XML 声明是这样的: <?xml version = "1.0" encoding= "GB2312" standalone = "no"?> 下面,就让我们来看看这几个属性的具体含义。 ·version 属性 version 属性指明所采用的 XML 的版本号,而且,它必须在属性列表中排在第一位。 ·encoding 属性 所有的 XML 语法分析器都要支持 8 位和 16 位的编码标准。只要知道下面几个常见的 编码就可以了:GB2312(简体中文码)、BIG5(繁体中文码)、UTF-8(西欧字符)。 XML 的字符编码标准是 Unicode, 该字符编码标准中每个字符用 16 比特表示,Unicode 码还能够兼容 UTF-8 编码。 采用哪种编码取决于你的文件中用到的字符集。 如果标记是采用中文书写的, 则必须在 声明中加上 encoding = "GB2312"的属性。 ·standalone 属性 standalone 属性表明该 XML 文件是否需要从其他外部资源获取有关标记定义的规范说 明,并据此检查当前 XML 文档的有效性。默认值为“no”,表示可能有也可能没有这样一个

文件。 “yes”,说明没有另外一个配套的文件来进行置标声明。 2

元素 元素是 XML 文件内容的基本单元。一个元素包含一个起始标记和一个结束标记。属性 和标记之间的数据内容是可选的,其形式如图所示。

元 元

<elementNAME attrName=""> content </elementNAME> 起元我起 这这 键字数数 结结我起

XML元素 元素可以包含其他元素、字符数据、实体引用、处理指令、注释和 CDATA 部分。这些 统称为元素内容(Element Content)。 位于文档最顶层的一个元素包含了文档中其他所有元素, 称为根元素。 元素之间应正确 地嵌套,不能互相交叉。所有元素构成一个简单的层次树,元素和元素之间惟一的直接关系 就是父子关系。层次结构如图所示。 COLLEGE

TITLE LEADER STU_NUMBER STUDENT NAME AGE SEX CLASS STUDENT NAME AGE SEX CLASS STUDENT NAME AGE SEX CLASS

XML 元素间的层次关系树 1)标记书写规则 XML 的标记和 HTML 的标记在模样上大体相同,除了注释和 CDATA 部分以外,所 有符号“<”和符号“>”之间的内容都称为标记。其基本形式为 <标记名 (属性名="属性值")* > · 标记命名要合法

XML 规范中的标记命名规则为:标记必须以字母、下划线“_”或冒号“:”开头,后跟有 效标记命名符号,包括字母、数字、句号“.”、冒号“:”、下划线“_”或连字符“-”,但是中间不 能有空格,而且任何标记不能以“xml”起始;另外,最好不要在标记的开头使用冒号,尽管 它是合法的,但可能会带来混淆。 · 区分大小写 在标记中必须注意区分大小写。在 HTML 中,标记<HELLO>和<hello>是一回事,但 在 XML 中,它们是两个截然不同的标记。 · 必须有正确的结束标记 如果开始标记是<HELLO>,结束标记应该写作</HELLO>。XML 要求标记必须配对 出现。不过,为了简便起见,当一对标记之间没有任何文本内容时,在开始标记的最后惯以 斜杠“/”来确认,这样的标记称为“空标记”,例如:<emptytag/>。 · 标记间要正确嵌套 在一个 XML 元素中允许包含其他 XML 元素, 但这些元素之间必须满足嵌套性, 标记 不能相互交叉。下面是最常见的 HTML 标记重叠的例子,它可以在大多数浏览器中使用, 但在 XML 中确是非法的,例如: <B>bold text<I>bold-italic</B>plain italic text...</I> 2)有效使用属性 标记中可以包含任意多个属性。在标记中,属性以“名称/取值”对的形式出现,属性名 不能重复,名称与取值之间用等号“=”分隔,且取值用引号引起来。例如: <commodity type = "服装" color= "黄色"> 在这个例子中, type 和 color 是 commodity 标记的属性, “服装”是 type 属性的取值, “黄 色”是 color 属性的取值。 属性命名的规范与标记命名规范大体相似,注意的是,在 XML 中属性的取值必须用 引号引起来。最后要说明一点,属性的所有赋值都被看作是字符串类型。 · 空格属性 xml:space 空格属性名为“xml:space”, 它用来说明是否需要保留 XML 元素数据内容中的空格字符。 空格属性只有两个可能的取值:default 和 preserve。 · 语言属性 xml:lang 语言属性用来说明 XML 元素使用何种语言。语言属性的取值较多,多以国际标准 ISO639 中的编码为标准,如英语的编码是 en,法语的编码为 fr。语言属性的取值也可以使 用 IANA(Internet Assigned Numbers Authority)中定义的编码。 3

注释 在 XML 中,注释的方法与 HTML 完全相同。 不过,在 XML 文件中使用注释时,要遵守以下几个规则。 (1) 在注释文本中不能出现字符“-”或字符串“--”,XML 解析器可能把它们和注释结尾 标志"-->”相混淆。 (2) 不要把注释放在标记之中。否则,它就不是一个“格式正规”的 XML 文档。例如下 面这段代码: <错误注释 <!-- 注释文本 --> > </错误注释> 类似的,不要把注释文本放在实体声明中,也不要放在 XML 声明之前。记住,永远 用 XML 声明作为 XML 文件中的第一行。 (3) 注释不能被嵌套。在使用一对注释符号表示注释文本时,要保证其中不再包含另

一对注释符号。例如下面例子是不合法的: <!-- 错误 XML 注释嵌套的例子 <!-- 一个注释 --> --> 使用注释时一定要小心,要确保文件在去掉全部注释之后,遵守所有“格式正规”文档 的要求。 4

内嵌的替代符 字符<、>、&、'和"是 XML 的保留字符,XML 利用它们定义和说明元素、标记或属性 等。XML 的解析器也将这些字符视为特殊字符,并利用它们来解释 XML 文档的层次内容 结构。这样一来,当 XML 内容中包含这些字符,并且需要显示它们的时候,就可能会带来 混乱和错误。为了解决这个问题,XML 使用内嵌的替代符来表示这些系统保留字符。如表 所示。

XML中的内嵌替代符

替代符 &lt; &gt; &amp; &apos; &quot;
5

含 < > & ? "



例 子 3&lt;5 5&gt;3 A&amp;B Joe&apos;s &quot;yes&q

解析结果 3<5 5>3 A&B Joe's "yes"

处理指令 处理指示(PI,Processing Instruction)用来给处理 XML 文件的应用程序提供信息。也就 是说,XML 解析器可能并不处理它,而把这些信息原封不动地传给 XML 应用程序来解释 这个指示并遵照它所提供的信息进行处理。其实,XML 声明就是一个处理指示。 所有的处理指示应该遵循下面的格式: <?处理指示名 处理指示信息?> 处理指示名需要服从 XML 语言的标识符命名规则。定义处理指令,需要把所定义的 处理指令名放在尖括号组成的括号对中,定义处理指令还可以定义若干属性。 由于 XML 声明的处理指示名是“xml”,因此其他处理指示名不能再用“xml”。例如在 本章的例子中,我们使用一个处理指示来指定与这个 XML 文件配套使用的样式单的类型及 文件名: <?xml-stylesheet type="text/xsl" href="mystyle.xsl"?> XML 样式表PI 的目的是将样式表与XML 文档相关联。XML样式表PI 的语义类似于TML 或XHTML链接元素的语义。href 和type 结构被称为伪属性(pseudo-attribute)。PI 实际拥 有六个伪属性, 但为简单起便, 我们在这里只讨论href和type 其他伪属性title、 ( media、 charset、 alternate)。在上述示例中,href 标识关于样式表mystyle.xsl的相对URI,而type 为样式 表 text/ xsl 定义一个媒体类型。 处理指令为 XML 开发人员提供了一种跨越各种元素层次结构的指令表达方式,从而 使得应用程序能够按照指令所代表的意义来处理文档,清单如下: <article> <title><?beginUseBold?>节约能源 </title> <content>能源危机<?endUseBold?>早已经不是陌生的话题

</content> </article> 6 CDATA 有些时候, 你希望 XML 解析器能够把你在字符数据中引入的标记当作普通数据而不是 真正的标记来看待。这时,CDATA 标记可以助你一臂之力。在标记 CDATA 下,所有的标 记、实体引用都被忽略,而被 XML 处理程序一视同仁地当作字符数据看待。CDATA 的基 本语法如下: <![CDATA[文本内容]]> 显然,CDATA 的文本内容中是不能出现字符串“]]>”的,因为它代表了 CDATA 数据块 的结束标志。前面我们讲过 XML 内嵌的替代符,但是当你的文本数据中包含大量特殊符号 时,你不得不通篇地使用替代符,把本来很清晰的一段文字搞得乱七八糟。为了避免这种不 便, 可以把这些字符数据放在一个 CDATA 数据块中, 这样不管它是否含有元素标签符号和 实体引用,这些数据统统被当作没有任何结构意义的普通字符串。例如清单如下: <Adress> <![CDATA[ <联系人> <姓名>Jack</姓名> <EMAIL>Jack@edu.cn</EMAIL> </联系人> ]]> </Adress> 只要有字符出现的地方都可以出现 CDATA 部分,但它们不能够嵌套。在 CDATA 部分中惟一能够被识别的字符串就是它的结束分隔符“]]>”。

4.3 文档类型定义 文档类型定义(DTD) XML 提供了一种机制——文档类型定义(DTD,Document Type Definition)。DTD 实际 上是“元标记”概念的产物,它定义了文件的整体结构以及文件的语法,一个 XML 文件必须 遵守文件类型描述 DTD 中定义的各种规定。 为了说明特定的语法规则,DTD 采用了一系列正则式,语法分析器将这些正则式与 XML 文件内部的数据模式相匹配,从而判别一个文件是否是有效的。 1、 将 DTD 与 XML 文档相关联 大多数的 XML 文档都是由序言和主体所构成的。 XML 文档序言中还可以包含 DTD 在 定义。 1).DOCTYPE 标记 为了将 DTD 声明与 XML 文档相关联,XML1.0 标准提供了特殊的 DOCTYPE 声明。 DOCTYPE 声明必须位于 XML 声明之后,且在任何文档元素之前。 DOCTYPE 声明包含关键字 DOCTYPE、 文档根元素的名称, 以及内容结构声明。 首先, 我们来看一个 DOCTYPE 声明在文档中的位置的例子: <?xml version = "1.0" encoding="GB2312" standalone = "yes"?> <!-- DOCTYPE 声明,其中可以包含文档类型定义 --> <!DOCTYPE 根元素名[ ]> <根元素名> </根元素名> 2).内部 DTD 子集 内部 DTD 子集通常定义为 <!DOCTYPE 文档根元素名[标记描述信息]> 例如,下面的语句定义了 XML 程序文档的一个内部 DTD 子集。 <!DOCTYPE myMessage[ <!ELEMENT myMessage(#PCDATA)> ]> 完整的包含内部 DTD 子集的 XML 文档,清单如下: <?xml version = "1.0" encoding="GB2312" standalone = "yes"?>

<!DOCTYPE 联系人列表[ <!ELEMENT 联系人列表 (联系人)*> <!ELEMENT 联系人 (姓名,ID,公司,EMAIL,电话,地址)> <!ELEMENT 地址 (街道,城市,省份)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT ID (#PCDATA)> <!ELEMENT 公司 (#PCDATA)> <!ELEMENT EMAIL (#PCDATA)> <!ELEMENT 电话 (#PCDATA)> <!ELEMENT 街道 (#PCDATA)> <!ELEMENT 城市 (#PCDATA)> <!ELEMENT 省份 (#PCDATA)> ]> <?xml-stylesheet type="text/xsl" href="mystyle.xsl"?> <联系人列表> <联系人> <姓名>张三</姓名> <ID>001</ID> <公司>A 公司</公司> <EMAIL>zhang@aaa.com</EMAIL> <电话>(010)62345678</电话> <地址> <街道>五街 1234 号</街道> <城市>北京市</城市> <省份>北京</省份> </地址> </联系人> <联系人> <姓名>李四</姓名> <ID>002</ID> <公司>B 公司</公司> <EMAIL>li@bbb.org</EMAIL> <电话>(021)87654321</电话> <地址> <街道>南京路 9876 号</街道> <城市>上海市</城市> <省份>上海</省份> </地址> </联系人> </联系人列表> 3)外部 DTD 外部 DTD 子集可以有以下两种定义方式:

(1) 利用一个简单的统一资源标识符 URI 来指明外部 DTD 文件的位置。 其一般形式为 <!DOCTYPE 文档根元素名 SYSTEM "URI 地址"> 例如, 下面的语句定义了 XML 程序文档的一个外部 DTD 子集, 它告诉 XML 解释器 定义了文档类型的 DTD 文件的位置。 <!DOCTYPE Ticket SYSTEM "http://www.ilusion.org/XmlDemo/tichet.dtd"> 其中,SYSTEM 是系统保留字,其后跟随说明外部 DTD 文件位置的 URI, 根元素名 为 Ticket。 (2) 外部 DTD 子集的另外一种定义方式使用 PUBLIC 系统保留字,采用 SGML 通用 的 FPI(Formal Public Identifiers)来定义 DTD 文件的位置,其语法格式如下所述: <!DOCTYPE Ticket PUBLIC "-//illusion//XmlDemo//EN"> 也可以把两种定义方式结合起来,例如: <!DOCTYPE Ticket PUBLIC "-//illusion//XmlDemo//EN" "http://www.ilusion.org/XmlDemo/tichet.dtd"> PS:有两种方法可以定义外部 DTD,一种是私有 DTD,另一个是公有 DTD。 (1)、 私有 DTD 是由个人或者工作组使用, 不公开发布。 使用关键字 SYSTEM 指定外部私有 DTD 例如: DOCTYPE DOCUMENT SYSTEM “order.dtd”> 或者 <!DOCTYPE DOCUMENT SYSTEM “http://www.starpowder,com/dtd/order.dtd”> (2)、使用关键字 PUBLIC 引用公有 DTD,必须先创建一个 FPI(formal public inentifier,正式公用标识符)。FPI 的规则如下: a、FPI 中的第一个域指定 DTD 到一个正式标准的链接。对于自定义的 DTD,这个 域应该是“-”;如果这个 DTD 是由一个非标准团体认可的,那么使用“+”。而正式的标准, 这个域应该是对该标准的引用(ISO/IEC 13449:2000); b、第二个域包括对于这个 DTD 负责维护的结构或者个人名称。 c、第三个域指出描述的文档类型,这个部分应该包含更新的版本号; d、第四个域说明 DTD 使用的语言。 e、FPI 中的各个域以双斜线“//”隔开。 结构为<!DOCTYPE rootname PUBLIC FPI URL> <!DOCTYPE DOCUMENT PUBLIC “-//starpowder//Custom XML Version 1.0 //EN” “http://www.starpowder.com/steve/order.dtd”> 下是一个外部 DTD 及引用该 DTD 的 XML 文档的例子,清单如下: 外部 <!ELEMENT 联系人列表 (联系人)*> <!ELEMENT 联系人 (姓名,ID,公司,EMAIL,电话,地址)> <!ELEMENT 地址 (街道,城市,省份)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT ID (#PCDATA)> <!ELEMENT 公司 (#PCDATA)> <!ELEMENT EMAIL (#PCDATA)> <!ELEMENT 电话 (#PCDATA)> <!ELEMENT 街道 (#PCDATA)> <!ELEMENT 城市 (#PCDATA)> <!ELEMENT 省份 (#PCDATA)>

<?xml version = "1.0" encoding="GB2312" standalone = "no"?> <!DOCTYPE 联系人列表 SYSTEM "fclml.dtd"> <?xml-stylesheet type="text/xsl" href="mystyle.xsl"?> 4).内部 DTD 子集和外部 DTD 的混合使用 一个 XML 文档可以同时拥有内部 DTD 子集和外部 DTD 子集。例如: <!DOCTYPE myMessage SYSTEM "myDTD.dtd"[ <!ELEMENT myMessage(#PCDATA)>]> 或者使用更加通用的方式定义: <!DOCTYPE 文档根元素名 PUBLIC "外部 DTD 信息 FPI" "外部 DTD 文件 URI" [内部标记描述信息]> 2 DTD 基本标记声明 DTD 通过四种标记声明定义 XML 文档中允许出现的内容。 4.2 显示了与这些声明 表 相关的关键字及其含义。

表4.2 DTD四种标记声明

DTD关键字 ELEMENT ATTLIST ENTITY NOTATION XML元素类型声明





特定元素类型可设置的属性以及这些属性的允许值声明

可重用的内容声明

不需要解析的外部内容的格式声明,以及用于处理这些内容的外部应 用程序

前两个声明与 XML 文档中的信息(元素和属性)相关。 实体(ENTITY)用于包含文档中反复出现的部分,其作用类似于 C++语言中的宏语句。 NOTATION 用于处理非 XML 内容。 3 实体 实体分为预定义实体、通用实体和参数实体三种。通用实体用于指代文本,而参数 实体多用来指代数据类型的定义。 1).预定义实体 &lt;、&gt;、&amp;、&apos;、和&quot 是 XML 标准预定义的实体,分别用来指代 特殊的字符。 2).通用实体 通用实体:内部实体,外部实体。

解析实体(Parsed Entity),非解析实体(Unparsed Entity)。 解析实体应该是符合 XML 文档规范的内容。 非解析实体可以是其他格式的文本或二进制块。 内部实体所指待 指待的内容定义在使用该实体的 XML 文档中。 指待 外部实体指代 指代的内容定义在使用该实体的 XML 文档外。 指代 其中,非解析实体一定是外部实体。 通用实体可被划分为三类:内部解析实体、外部解析实体和外部非解析实体。 (1) 内部解析实体 ) 内部解析实体可以在内部 DTD 子集 子集中声明,一般语法格式为: 内部 <!ENTITY 实体名 "实体内容"> 使用实体时,在实体名前加一个“&”符,后跟一个“;”符。引用方法“&实体名;”清单 如下:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE NEWS[ <!ENTITY TeamA1 "中国队"> <!ENTITY TeamA2 "泰国队"> <!ENTITY ScoreA "1:0"> <!ENTITY TeamB1 "沙特队"> <!ENTITY TeamB2 "韩国队"> <!ENTITY ScoreB "0:0"> ]> <NEWS>新华社讯:在今天的两场亚洲杯足球赛中,&TeamA1;以&ScoreA;的 比分战胜了&TeamA2;,&TeamB1;与&TeamB2;以&ScoreB;握手言和。 </NEWS> 新华社讯:在今天的两场亚洲杯足球赛中,中国队以 1:0 战胜了泰国 队,沙特队与韩国队以 0:0 握手言和。 (2) 外部解析实体 ) 内部解析实体可以帮助 XML 文档实现字符串 字符串的替代,如果希望在 XML 文档中引 字符串 用一个完整的文件 文件,则需要使用外部解析实体。 文件 与外部 DTD 声明一样,外部解析实体也有两种声明方式: · 使用 SYSTEM 关键字和 URI 来指明包含实体定义的外部文件的位置,其 一般格式为: <!ENTITY 实体名 SYSTEM "实体定义文件的 URI"> 以下是一个外部解析实体定义: <!ENTIEY ABC SYSTEM "http://www.ilusion.com/XmlDemo/News.txt"> 如果 http://www.ilusion.com/XmlDemo/News.txt 文件的内容为:“新华社讯:在 今天的两场亚洲杯足球赛中, 中国队以 1:0 战胜了泰国队, 沙特队与韩国队以 0:0 握手言和。 ” 则在 XML 文档中所有出现实体应用“&ABC;”的部分均会被解析器用上述的文本内容所指 代。 · 利用 FPI 格式声明其位置,例如: <!ENTIEY ABC PUBLIC "-//illusion/XmlDemo/EN">

外部解析实体的定义信息,即用来说明实体名的包含 ENTITY 标记的 DOCTYPE 定义信息,可以出现在 XML 文档的内部 DTD 子集中,也可以以单独的外部文 件形式存在。在第一种情况下,XML 文档中应该包含这样的语句: <!DOCTYPE NEWS[ <!ENTITY ABC SYSTEM "http://www.ilusion.com/XmlDemo/News.txt"> ]> 第二种情况下,XML 文档应该包含这样的语句: <!DOCTYPE NEWS SYSTEM "News.dtd"> 而 News.dtd 文件中应该包含: <!ENTITY ABC SYSTEM "http://www.ilusion.com/XmlDemo/News.txt">

(3) 外部非解析实体 ) 外部非解析实体用来在 XML 程序文档中加入二进制数据,例如,图像、声音等多 媒体数据。定义外部非解析实体的语法为 <ENTITY 实体名 SYSTEM "URI" NDATA 标注名> 或 <ENTITY 实体名 PUBLIC "FPI" NDATA 标注名> 下面的语句定义了一个指代 GIF 图像数据的外部非解析实体: <!ENTITY MYPICTURE "http://mymschine:8080/xml/mypicture.gif" NDATA gif> 外部非解析实体定义是以数值的方式 数值的方式赋给 XML 程序文档中的元素。 数值的方式 例如,上面定义的外部非解析实体 MYPICTURE,可以在如下的语句中使用: <IMC PIC="MYPICTURE"/> 元素 IMG,指定其属性 PIC 的属性值为外部非解析实体 MYPICTURE。当 XML 解析 器读到上述的语句时, 并不会试图引入或展开 MYPICTURE 外部实体所指代的二进制数据, 需要使用 XML 的应用程序来处理。 3.参数实体 . 定义中。它 仅在 DTD 中使用的解析实体称为参数实体。参数实体只能使用在 DTD 定义中 只能使用在 一般用来引用 DTD 中常用的结构块。 参数实体的内容定义语法为 <!ENTITY %参数实体名 "参数实体内容"> 参数实体的定义格式需要加一个百分号%来说明当前定义的实体是参数实体。 参数实体的外部定义语法为 <!ENTITY %参数实体名 SYSTEM "URI"> 或 <!ENTITY %参数实体名 PUBLIC "FPI" "URI"> 在 DTD 中使用参数实体时,在参数实体名前面加百分号%,后面加分号“;”。例如, 下面的语句定义了参数实体 PARAENTITY: <!ENTITY %PARAENTITY "<!ENTITY MYENTITY SYSTEM 'http://test:8080/xml/one.txt'>"> 在 DTD 中使用参数实体 PARAENTITY 的格式是“%PARAENTITY;”。它代 表了对实体 MYENTITY 的定义。 清单如下: <!-- A DTD for Voice Extensible Markup Language -->

<!--Copyright(c)2000 VoiceXML From (AT&T,IBM ,Lucent technologies,Motrola)> <!ENTITY %audio "#PCDATA|enumerate|value"> <!ENTITY %boolean " (true|false) "> <!ENTITY %content.type "CDATA"> <!ENTITY %duration "CDATA"> <!ENTITY %event.hander "catch|help|noinput|nomatch|error"> <!ENTITY %event.name "NMTOKEN"> <!ENTITY %executable.content " %audio;|assign|clear|disconnect|exit|goto|if|prompt| rerompt|return|script|submit|throw|var"> <!ENTITY %exprssion "CDATA"> <!ENTITY %feild.name "NMTOKEN"> <!ENTITY %feild.names "NMTOKENS"> <!ENTITY %integer "CDATA"> <!ENTITY %intem.attrs "name %field.name; #IMPLIED cond %expression; #IMPLIED expr %expression; #IMPLIED"> 4、 元素类型声明 、 各元素在使用之前必须首先声明,声明的内容包括该元素的字符数据和属性,以及其 中可以包含哪些子元素。元素类型声明的基本格式为 <!ELEMENT 元素名 元素内容模式> 下例中的 intro.xml 文档中使用了一个名为 myMessage 的元素,该元素的声明在文件 intro.dtd 中可以找到,清单如下: <!DOCTYPE myMessage SYSTEM "intro.dtd"> <myMessage> <message>Welcome to XML!</message> </myMessage> <!ELEMENT myMessage(message)> <!ELEMENT message(#PCDATA)> 其中,元素 myMessage 为根元素名,该元素只包含了一子元素 message。 1).元素的模式 .元素的模式 元素的四种模式:空模式、任意模式、复合内容模式和子元素定义集模式。 (1) 空模式 这种模式定义的元素不能包含任何子元素,也不能包含任何字符数据。 <!ELEMENT 元素名 EMPTY> 例如: <!ELEMENT Empty_ele EMPTY> 它在 XML 程序文档中只能<Empty_ele />或< Empty_ele ></ Empty_ele > 空元素可以拥有属性。 (2) 任意模式

“任意模式”元素就可以包含任何子元素或字符数据。该元素的任何表述都有 效,也就是没有任何限制。 <!ELEMENT 元素名 ANY > 例如: <!ELEMENT Be_anything ANY> 定义了一个任意模式的元素 Be_anything。该元素可以包括任何内容,可以包 含任何内容, 也可以包含任何子元素或子元素与可解析字符数据(# PCDATA)的组 合。 (3) 复合内容模式 复合内容模式并没有一个固定的关键字与其相对应。 <!ELEMENT Mix(#PCDATA)> 其中#PCDATA 是 XML 系统定义的标识符,专门用来指代可被 XML 解析器 正确解析的字符数据。对于在具体应用中哪些内容可以对应#PCDATA 标识符,XML 语法 并未做进一步的规定。XML 标准中规定使用复合内容模式时,#PCDATA 关键字必须是模 式中的第一个选项 第一个选项。 第一个选项 除了数据之外,复合内容中还可能包括其他元素。例如: <!ELEMENT MIX(#PCDATA|SUBELEMETNT1|SUBELEMENT2)*> 可见复合内容模式的一般语法结构为 <!ELEMENT(数据|子元素 1|子元素 2…)> 复合内容元素的内容也可以为空。下列 mixed.xml 文档的 DTD 定义了三个元素:一 个复合内容元素、两个包含数据#PCDATA 的元素。清单如下: <?xmt version ="1.0" standalone="yes"?> <--Mixed content type elements-- > <!DOCTYPE format[ <!ELEMENT format(#PCDATA|bold|italle)*> <!ELEMENT bold (#PCDATA)> <!ELEMENT italic (#PCDATA)> ]> <formal> This is a simple formatted sentence. <bold>I have tried bold .</bold> <italic>I have tried italic.</italic> Now what? </format> 其中声明的元素 format 是一个复合内容模式的元素,它可以包含数据#PCDATA、 元素 bold 或元素 italic。元素 bold 和元素 italic 只能包含数据#PCDATA,不能包含子元素。 (4) 子元素定义集模式 子元素定义集模式用来说明那些有严格层次结构包含关系的元素。 利用子元素定义 集模式,可以说明某元素必须包含哪些子元素及其相互位置、层次关系。例如: <!ELEMENT MYELEMENT(SUBLELMENT)> 该语句将元素 MYELEMENT 定义为子元素定义集模式的元素, 其中只包含一个子 元素 SUBMELEMENT。 通过这样的定义之后,XML 文档使用元素 MYELEMENT 的程序段就可以为如下 清单:

<MYELEMENT> <SUBELEMENT>新年快乐!</SUBELEMENT> </MYELEMENT> 又例如: <!ELEMENT OURELEMENT(SUBELEMENT1, SUBELEMENT2)> 与这个元素定义相对应的 XML 程序文档可以为如下清单: <OURELEMENT> <SUBELEMENT1>新年愉快!</SUBELEMENT1> <SUBELEMENT2>万事如意!</SUBELEMENT2> </OURELEMENT> 用逗号分隔,说明这些子元素之间有严格的先后顺序。 用竖线分隔,说明这些子元素不能在一个元素中同时出现,只能出现其中一个。 例如,上面的定义对应的 XML 程序文档可以为如下清单: <OURELEMENT> <SUBELEMENT2>新年快乐!</SUBELEMENT2> <OURELEMENT> 在子元素定义集模式中,逗号和竖线还可以混合使用,例如: <!ELEMENT GREETINGS((SEASON|NAME), POSTFIX)> 这个子元素定义集模式中定义的元素 GREETINGS 可以包含 SEASOON 和 POSTFIX 两个子元素,也可以包含 NAME 和 POSTFIX 两个子元素。例如如下清单: <GREETINGS> <SEASON>新春快乐!<SEASON> <POSTFIS>万事如意!<POSTFIS> </GREETINGS> <GREETINGS> <NAME>老李</NAME〉 <POSTFIS>生日快乐!<POSTFIS> </GREETINGS> 2).元素内容模型 . 内容模型是一种规范,它定义了元素内容的内部结构 元素内容的内部结构。 元素内容的内部结构 (1) “( )”圆括号 圆括号用于组合元素以及#PCDATA,使它们作为一个整体来看待。 (2) 运算符 · ‘,’逗号运算符。表示元素之间具有严格的顺序出现关系。 ·‘|’管道运算符。表示元素只能选择其中一个出现。 (3) 修饰符 修饰符表示出现的次数。XML 共定义了三种不同的修饰符。 · ‘?’修饰符。‘?’修饰符说明它所修饰的元素和元素组合可以出现 0 次或 1 次,即这种组合可以出现,也可以不出现。例如: <!ELEMENT MYELEMENT (SUBELEMENT1,SUBELEMENT2?) > 和 <!ELEMENT MYELEMENT (SUBELEMENT1,SUBELEMENT2)?> ·‘+’修饰符。‘+’修饰符说明至少必须出现 1 次,可以为任意多次。

·‘*’修饰符。‘*’修饰符说明出现 0 次到任意多次。

5 属性声明 DTD 中的属性声明用来定义元素可接受的属性。属性定义相对于元素定义较为灵活, 它可以出现在 DTD 定义信息的任何部分,并不强制要求出现在对应元素的 DTD 定义之后, 有时甚至可以为尚不存在的元素定义属性,从而扩大了属性定义的适用范围。 属性定义的一般语法为 <!ATTLIST 元素名 属性名 1 类型 缺省取值 属性名 2 类型 缺省取值> ATTLIST 是 XML 系统保留字。 元素名是要定义其属性的元素名。 属性声明包括该:属性的名称 属性的类型 缺省的属性值(可选) 属性名必须是以字母开头,包括字母、数字、短横线、下划线和句号的字符串。 下面的文档为元素 message 定义了属性 id。该属性的类型为 CDATA,缺省值为 #REQUIRED 型,清单如下: <?xml version= "1.0 "> <!DOCTYPE myMessage[ <!ELEMENT myMessage(message)> <!ELEMENT message(#PCDATA)> <!ATTLIST message id CDATA #REQUIRED> ]> <myMessage> <message id= " 445">Welcome to XML!</message> </myMessage> 1).属性类型(十种类型) (1) CDATA CDATA 类型说明该属性的取值可以是任意的字符串, 限制最少、 最自由的属性。 (2) ID ID 类型说明该属性的取值可以是任意合法的标识符。ID 类型的属性是用来惟一

标识元素的属性,所以一个元素只有一个 ID 类型的属性,而且 ID 属性的取值必须 与 XML 文档中其他元素的 ID 类型属性的取值不同。 (3) IDREF IDREF 类型的属性取值必须与当前 XML 文档中某个元素的 ID 属性取值相同。 IDREF 属性是为了方便拥有该属性的元素引用其他元素,即利用其他元素的 ID 属性 找到其他元素并与之交互。 (4) IDREFS IDREFS 类型的属性与 IDREF 类型的属性基本相同, 不同之处在于 IDREFS 类型 的属性,其取值必须是当前 XML 文档中其他元素 ID 属性的取值,即 IDREFS 属性 可以包含一个和多个其他 XML 元素的 ID, 从而起到引用这些属性的作用。 IDREFS 若 属性中包含了一个以上的 ID,则这些取值之间应该用空格分隔。 下面的文档定义了包含 ID 和 IDREF 类型属性的元素,清单如下: <?xml version="1.0"?> <!--Example for ID and IDREF values of attributes--> <!DOCTYPE bookstore[ <!ELEMENT bookstore(shipping+,book+)> <!ELEMENT shipping(duration)> <!ATTLIST shipping shipID ID #REQUIRED> <!ELEMENT book(#PCDATA)> <!ATTLIST book shippedBy IDREF #IMPLIED> <!ELEMENT book(#PCDATA)> ]> <bookstore> <shipping shipID="s1"> <duration>2 to 4 days</duration> </shipping> <shipping shipID="s2"> <duration>1 day</duration> </shipping> <book shippedBy="s2">Java How to Program 3rd edition.</book> <book shippedBy="s2">C How to Program 3rd edition.</book> <book shippedBy="s1">C++ How to Program 3rd edition.</book> </bookstore> (5) ENTITY ENTITY 类 型 的 属 性 的 取 值 必 须 是 当 前 XML 文 档 中 的 某 个 外 部 实 体 名 (ENTITY)。 拥有 ENTITY 类型属性的元素利用这种属性来引用外部实体。通过这 种方式,可以引用各种类型的数据,而不仅仅是 XML 标记。 (6) ENTITIES ENTITIES 类型的属性与 ENTITY 类型的属性相似,只不过 ENTITIES 类型的 属性可以包含多个外部实体名,其 间用空格分隔。 下面的文档定义了包含 ENTITY 类型属性的元素,清单如下: <?xml version="1.0"?> <!--ENTITY and ENTITIES attribute types -->

<!DOCTYPE database [ <!NOTATION html SYSTEM "iexplorer"> <!ENTITY city SYSTEM "tour.html" NDATA html> <!ELEMENT database(company+)> <!ELEMENT company(name)> <!ATTLIST company tour ENTITY #REQUIRED> <!ELEMENT name(#PCDATA)> ]> <database> <company tour="city"> <name>Deitel &anp;Associates,Inc.</name> </company> </database> (7) NMTOKEN 有时候,可能希望将属性值作为离散 离散的记号,而不是文本,就需要使用名称记 离散 号类型(NMTOKEN)。NMTOKEN 类型属性的取值只能包括字母、数字、句号、短 横线、下划线、冒号, NMTOKEN 的第一个字符可以是任意字符。 (8) NMTOKENS NMTOKENS 类型属性的取值可以是若干个 NMTOKEN 类型属性的取值,其 间用空格分隔。例如: <!ATTLIST club phone NMTOKEN #REQUIRED> 声明了元素 club 包含一个 NMTOKEN 类型的 phone 属性,定义: <club phone="010-66789876"> (9) NOTATION 当我们讨论实体类型的属性时, 通过将实体名作为属性值, 可以将 GIF 或 JPEG 等图形文件与元素相关联。可以使用 NOTATION 标识来链接到 XML 文档的外部 数据项的格式。表示法声明能够说明格式的名称 格式的名称,以及相关的外部处理器 外部处理器。 格式的名称 外部处理器 NOTATION 的定义与外部实体的定义相仿,其语法为 <!NOTATION 标识符 SYSTEM "标注类型"> 或 <!NOTATION 标识符 PUBLIC "FPI" "标注类型"> 例如:<!NOTATION gif SYSTEM "gifviewer.exe">。 现在我们知道,当 gif 作为 NOTATION 的名称时,与之相关的数据将发送给 gifviewer.exe 处理。例如: <!NOTATION gif SYSTEM "gifviewer.exe"> <!NOTATION jpg SYSTEM "jpgviewer.exe"> <!ATTLIST IMAGE type NOTATION (gif|jpg ) "gif"> 元素可以写为 <IMAGE type="jpg"> (10) 枚举类型 枚举类型不需要关键字定义, 直接列出当前属性的所有可能取值。 这些具体的 属性值使用圆括号括成一组, 各属性值之间用竖线分隔, 各属性本身不需要用引号 括起来。例如: <!ATTLIST person gender(M|F) "F"> 则属性 gender 的取值只能是“M”和“F”中的一个,缺省值为“F”。

2).属性的缺省值 属性可以定义缺省值,也可以不定义。几种系统定义的属性缺省取值: (1) #REQUIRED 属性的缺省值为#REQUIRED,必须有一个具体的取值,即取值不能为空。 (2) #IMPLIED 若属性的取值为#IMPLIED,说明属性可以有具体的属性值,也可以为空。 (3) 用引号括起来的具体数据 若不特别指定属性的取值,就以该值为属性值。例如:“video”,“23.50”。 (4) #FIXED“具体取值” #FIXED“具体取值”说明取值固定为引号括起来的具体值,即该取值是常量。

4.4 命名空间 命名空间(Name Space) 1)多义性和名称冲突 ) 有时不同的 XML 程序文档会使用同名的元素或属性, 例如飞机订票系统 XML 文档 中使用元素 DATE 来说明飞机的起飞时间,而学生信息系统使用元素 DATE 来说明学 生的生日。此时两个不同的 DATE 共存于一个系统之中,元素的多义性就会造成混乱。 另一方面,有时不同的 XML 程序文档会把相同含义的元素命名为不同的标识符, 例如同样是表示“价格”的元素,有的 XML 程序文档会命名为 PRICE, 有的则会命名为 SINGLEPRICE。 开发人员在编写 XML 程序文档时需要在 DTD 文档中定义和命名自己的元素和属 性,由于 XML 应用的领域不同,这些元素和属性的命令通常也不相同。 2) 定义和声明命名空间 ) 命名空间是解决多义性和名字冲突问题的另一种方法。 使用它的主要目的是为所有 同一领域中的 XML 元素和属性提供统一的通用命名法则。 XML 命名空间使用“统一资源标识符(URI)”进行命名组织。 因为每个 URI 都是惟一 的, 因此如果在 XML 文档中将相同的元素名或属性名前加上不同的 URI 前缀,那么元 素名和属性名之间就永远不会相互混淆。 因为 URI 通常很长,如果每个元素都加上一个 URI 将带来书写的不方便。因此, 可以为每个命名空间设置一个较短的别名, 它被用作命名空间的引用。 该别名必须遵守 XML 标记命名规则。另外,它不能以 xml 和 xmlns 开头。 命名空间是在元素的开始标签内声明的。声明命名空间的语法如下所示: <元素名 xmlns="URI"> 或 <元素名 xmlns:前缀="URI"> 清单如下: <?xml version="1.0"?> <message xmlns ="http://www.northwintraders.com/bill"> <date>1/1/2002</date> <body>Your current balance is $1 999 999.00.Please pay immediately. </body> </message> 在上面的 XML 文档的 message 元素中声明了命名空间,但该命名空间没有前 缀,称该元素使用了“默认的命名空间”。值得注意的是,该命名空间的作用范围是 message 以及所有的子元素。也就是说,如果其子元素没有使用自己的命名空间前缀, 那么它将使用其祖先元素的命名空间。也可以在一个元素的开始标签中声明多个命名

空间,清单如下: <?xml version="1.0"?> <bill:message xmlns:bill="http://www.northwintraders.com/bill" xmlns:jack="http://www.northwindtrader.com/message"> <bill:date>1/1/2002</bill:date> <jack:body>Your current balance is $1 999 999.00.Please pay immediately.</bill:body> </ bill:message> 在该示例中,message 元素包括两个命名空间声明 bill 和 jack。bill 命名空间用来 定义 message 元素和 date 子元素;jack 命名空间被用来定义 body 子元素。如果某个 命名空间的 URI 是指向一个 DTD 文件的 URL,那么表明属于该命名空间的元素是 在该 DTD 文件中加以定义的。但这并不是必须的。例如:

<?xml version="1.0"?> <catalog1:message xmlns:catalogue1="http://www.northwintraders.com/catalog1.dtd" xmlns:jack="http://www.northwindtrader.com/catalog2.dtd"> <catalog1:date>1/1/2002</catalog1:date> <catalog2:body>Your current balance is $1 999 999.00.Please pay immediately. </ catalog2:body> </ catalog1:message> 在这里, 前缀 catalog1 将要涉及到来自 catalogue1.dtd 里声明的元素, 前缀 catalog2 将要涉及来自 catalog2.dtd 里声明的元素。如图 4.3 所示元素与 DTD 的关系。

<catalog1:message xmlns :catalogue1="http://www.northwintraders.com/catalog1.dtd"
保保相 的的的 键键 的的的 的的的的

URI
的的的的

<date ...> catalog1.dtd

<body ...> catalog2.dtd

<catalog1:date> <catalog2:body>

图4.3 元素与DTD的关系 3)属性和命名空间 ) 在一个元素中,一个属性名只能被使用一次。使用命名空间前缀来限定属性名,可

以使用不同的命名空间限定一个属性名, 使得同名的属性可以在一个元素里出现。 例如, 下面的形式是可以接受的,清单如下: <?xml version="1.0"?> <message xmlns="http://www.northwindtrader.com/bill" xmlns:catalog="http://www.northwindtrader.com/message"> <date>1/1/2002</date> <catalog:body catalog:importance="High" important="High"> Your currentbalance is $1 999 999.00. Please pay immediately. </ catalog:body> </message>

4.5 模式 模式(Schema) 1 XML 模式与 DTD XML 模式是针对 DTD 的缺点而设计的, XML 模式是一种用来描述信息结构的机制。 可用来定义 XML 文档的结构、数据类型等内容。它不仅包含了 DTD 文件所能实现的 全部功能,同时它自身也是一个完全规范的 XML 文档。 XML 模式与 DTD 相比有以下一些主要特点: (1) XML 模式使用 XML 语法。因为 XML 模式本身就是 XML 文档,它可以像 其他任何一个 XML 文档那样,使用 XML 编辑器编辑,利用 XML 解析器对模式进行 解析。 (2) XML 模式有着丰富的数据类型。XML 模式不仅支持一些内嵌的数据类型, 例如:string、integer、boolean、time、date 等,还提供了定义新数据类型的能力。例如: <birthday>五一节</ birthday> < birthday >2003-10-1</ birthday > 元素 birthday 内容的合法格式应该是日期类型的。 因为 DTD 文件不能提供内容检查 功能。当元素内容为“五一节”时没有通过包含有内容的有效性检查。 有了 XML 模式,元素 birthday 的数据类型就可以被定义为日期型。这样一来,如 果在 XML 模式中定义元素 birthday 为一个日期类型的数据,那么<birthday>五一节 </birthdat>将不能通过有效性检查。 只有通过 XML Schema 检查的 XML 文档才是有效 的,否则是无效的。 (3) XML 模式支持继承。可以利用已经存在的模式中的某些类型构造新的模式。 同时,XML 模式能够将一个模式分成单独的组件,这样,我们在书写模式时,就可以 正确地引用已经定义的组件。继承性使得软件复用更加有效,大大缩短了 XML 的软 件开发过程,方便了代码维护,提高了编程效率。 (4) 与命名空间紧密联系。XML 模式使得在同一个命名空间中创建元素和属性非 容易。 XML 模式的实例文档常常用来描述一个与特定 XML 模式相一致的 XML 文档。 事实上, 实例文档和模式文档都不是必须要以文档的形式存在, 它们可以以应用之间传 递的字节流的形式存在,或者作为一个数据库记录,也可以作为 XML 的“信息项”的集 合存在。

XML 模式规范 XML 模式规范由三部分组成: (1) XML Schema Part 0:Primer。它提供 XML 模式的简单可读性的描述。 (2) XML Schema Part 1:Structure。这一部分详细说明了 XML 模式定义语言,这 些组件分为三组: ① 基 本 组 件 。 简 单 类 型 定 义 (Simple Type Definitions) 、 复 杂 类 型 定 义 (Compelex Type Definitions)、元素声明(Element Declarations)、属性声明 (Attribute Declarations)。 ② 组件。属性组(Attribute Group Definition)、约束定义(Identity-Contraint Definitions) 、 模 型 组 (Model Group Definitions) 、 符 号 声 明 (Notation Declarations)。 ③ 辅助组件。注释(Annotations)、模型组(Model Groups)、小品词(Particles)、 通配符(Wildcards)、属性使用(Attribute Uses)。 (3) XML Schema Part 2:Datatypes。这一部分定义了数据类型的方法。 类型系统描述了这个规范中定义的类型系统的概念框架。内嵌的数据类型描 述了可通过命名空间(xmlns="http://www.w3.org/2001/XML Schema")引用的一些内 嵌的数据类型。共有 19 种基本数据类型,包括 string、boolean、decimal 等。此外, 还有 25 种引用数据类型,包括 normalizedString、token 等。 下面来看一个简单的 XML 模式的例子。清单如下: <?xml version="1.0"> <xsd:schema xmlns:xsd="http://www/w3.org/2001/XMLSchema" xmlns:pl="http://myserver/firstSchema" targetNS="http://myserver/firstSchema"> <xsd:element name="BOOK" type="pl:bookType"/> < xsd:complexType name="bookType"> < xsd:sequence> < xsd:element name="TITLE" type="string"/> <xsd:element name="AUTHOR" type="pl:authorType" minOcurrs="1" maxOcurrs="5"/> </ xsd:sequence> </ xsd:complexType> < xsd:complexType name="authorType"> < xsd:sequence> < xsd:element name="AUTHORNAME" type="string"/> < xsd:element name="SEX" type="sexType"/> < xsd:element name="BIRTHDAY" type="date"/> </ xsd:sequence> </ xsd:complexType> < xsd:simpleType name="authorType"> < xsd:restriction base="string"> < xsd:enumeration value="男"/> < xsd:enumeration value="女"/> </ xsd:restriction> </ xsd:simpleType> </ xsd:schema>

2

以上的模式文档由一个 Schema 元素和一系列子元素组成,它们决定了实例 XML 文 档 中 的 元 素 的 表 现 方 式 和 内 容 。 通 过 在 Schema 元 素 中 声 明 命 名 空 间 xmlns:xsd="http://www.w3.org/2001/XMLSchema",在模式文档中的每一个元素都有一 个与 XML 模式命名空间相联系的命名空间前缀“xsd:”。尽管任何前缀都能够被使用, 但是,前缀“xsd:”被约定用于表示 XML 模式命名空间。通过使用同样的前缀,同样的 关联也出现在内置的简单类型的名字中,例如 xsd:string。这种关联形式用来标识元素 和简单类型是属于 XML 模式语言本身的词汇表而不是模式文档作者自己的词汇表。 下面是该模式对应的一份有效的 XML 实例文档。清单如下:

<?xml version="1.0"> <BOOK> <TITLE>XML 模式规范</TITLE> <AUTHOR> <AUTHORNAME>王方</AUTHORNAME> <SEX>女</SEX> <BIRTHDAY>1975-7-12</BIRTHDAY> </AUTHOR> <AUTHOR> <AUTHORNAME>宋涛</AUTHORNAME> <SEX>男</SEX> <BIRTHDAY>1950-6-1</BIRTHDAY> </AUTHOR> </BOOK> 3 数据类型 XML 模式应用最为广泛的方面也许就是其丰富的数据类型。 XML 模式数据类型 规范定义了两类数据类型:原始数据类型(Primitive Data Types)和派生数据类型 (Derived Data Types)。所有原始数据类型都在规范中加以定义,因此它们都属于内置 数据类型(Built-In Data Types),而用户创建的都是派生数据类型,由规范定义的几种 派生数据类型也属于内置数据类型。 4.4 显示了这些内置数据类型以及其派生关系。 图 1).原始数据类型 ) 下面列出了几种常用的原始数据类型: · string:任意长度的字符串; · boolean:该数据是下列任何字符串:真值为 1 或 true,假值为 0 或 false; · decimal:任意精度的十进制数据,可以带有正负号或小数点; · float:单精度 32 位浮点数字; · anyURI:代表一个 URI,通常是 URL; · Qname:代表命名空间的限定名,如果后面带有冒号,则冒号前面的文本 是命名空间的前缀,否则说明该名称属于默认命名空间。 · NOTATION:对应于 XML NOTATION 属性类型;

· · · · · · ·

hexBinary:使用十六进制表示的二进制数据类型; base64Binary:用 base64 编码的二进制数据; duration:表示时间长度,例如 P2Y 表示两年 date:表示日期类型。 base64Binary:用 base64 编码的二进制数据; duration:表示时间长度,例如 P2Y 表示两年 date:表示日期类型。

duration boolean string

datatime

time

date

gYearMonth gYear float double

gMonthDay gDay

gMonth

base64Binary hexBinary

anyURI decimal integeg

QName NOTATION

nomalizedString token

nonPositive Integer language Name NMTOKEN negativeInteger NCName UMTOKENS

long

nonNegativeInteger

int

unsignedLong

positiveInteger

short ID IDREF ENTITY byte IDREFS ENTITIES Built primitive types -in Built derived types -in Derived by restriction Derived by list

unsignedShort

unsignedByte

图4.4 模式内置的数据类型 2)派生数据类型 ) 派生数据类型基于原始数据类型之上,XML 模式规范规定了一些派生数据 类型, 并给出了用户派生定义数据类型的工具。 下面是几种常用的内置派生数据 类型: · integer:没有分数部分的十进制数字; · byte:8 位带符号数字; · short:16 位数字; · ID:文档中单个元素独有的标识符; 用户派生定义数据类型主要有以下几种方式: (1) 约束派生。约束已有数据类型允许值。 (2) 列表派生。派生类的值是已有数据类型值的空格分隔列表。 (3) 联合派生。派生类可以是数据联合多个数据类型中的任意一个。 3)侧面(Facet) )侧面 侧面用来从不同角度对数据类型进行约束。下面是几种常用的侧面:

· · · · · · · · · · · ·

minInclusive 和 maxInclusive:约束新数据类型允许的最小值和最大值; minExlusive 和 maxExclusive:约束取值的下上界(不能取设定值); minLength 和 maxLength:约束新数据类型的长度; totalDigitals:约束十进制表示中的最大位数; fractionDigit:约束十进制小数部分的最大位数; enumeration:约束新数据类型的取值只能为枚举出的值; pattern:用正则表达式约束新类型的取值格式。 minLength 和 maxLength:约束新数据类型的长度; totalDigitals:约束十进制表示中的最大位数; fractionDigit:约束十进制小数部分的最大位数; enumeration:约束新数据类型的取值只能为枚举出的值; pattern:用正则表达式约束新类型的取值格式。

4 类型声明 1).复合类型 ) 复合类型(complexType) XML 模式支持的复合类型一般为用户自定义的数据类型,它可以包含子元 素、属性和字符数据。新的复合类型使用 complexType 元素来定义,典型定义包 括一组元素声明、元素引用和属性声明。元素使用 element 元素声明,同时属性 使用 attribute 来声明。 (1) name+type 型声明 例如:USAddress 被定义为一个复合类型并且在 USAddress 定义中我们看到 五个元素的声明和一个属性的声明,清单如下: <xsd:complexType name="USAddress" > <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="street" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="state" type="xsd:string"/> <xsd:element name="zip" type="xsd:decimal"/> </xsd:sequence> <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/> </xsd:complexType> 这个定义的结果将是,在实例文档中出现的任何类型声明为 USAddress 的元素 必须包含五个元素和一个属性。这些元素必须被命名为 name、street、city、state 和 zip , 这 些 名 称 就如 同 在模 式 声 明中 name 属 性的 值 所 指 的那 样 。 因为使 用 了 <xsd:sequence>元素,这些元素必须按照模式声明中的同样的顺序出现。前四个元素 包含字符串类型的数据内容, 而第五个必须包含十进制数字类型的数据内容。 声明为 USAddress 类型的元素可以带有一个 country 属性,该属性的固定取值为“US”。 一个复合类型一旦定义后, 就可以用来定义其他复合类型的元素, 但是不能被用 来定义属性的类型。 例如, 下列 PurchaseOrderType 类型定义中就出现了使用复合类型 的子元素声明,清单如下: <xsd:complexType name="PurchaseOrderType"> <xsd:sequence> <xsd:element name="shipTo" type="USAddress"/>

<xsd:element name="billTo" type="USAddress"/> <xsd:element ref="comment" minOccurs="0"/> <xsd:element name="items" type="Items"/> </xsd:sequence> <xsd:attribute name="orderDate" type="xsd:date"/> </xsd:complexType> 在 PurchaseOrderType 的类型定义中, 对于 shipTo 和 billTo 这两个子元素的声明, 它们将不同的元素名字和相同的复合类型相关联,这个复合类型是 USAddress。这个 定义的结果是,在实例文档中出现的任何元素,当元素类型被声明为 PurchaseOrderType 时,这个元素必须包含两个名为 shipTo 和 billTo 的元素,这两个 元素都要包含五个子元素(name、street、city、state 和 zip),这五个子元素是作为 USAddress 声明的一部分而出现的。根据 USAddress 的类型定义,shipTo 和 billTo 元 素也可以包含 country 属性。 PurchaseOrderType 类型定义包含了一个 orderDate 属性声明,就像在 USAddress 中的 country 属性声明一样,它被标识为一个简单类型,实际上,所有的属性声明必 须引用简单类型。这是因为不像元素声明那样,属性不能包含其他元素或者属性。 (2) ref 引用 迄今为止我们描述的元素声明都是采用一个新元素名与一个现存的类型定义相关 联的方式。然而,有时候直接使用一个现存的元素比定义一个新的元素更方便。例如: <xsd:element ref="comment" minOccurs="0"/> 这个声明定义引用了一个现存的元素 comment, 该元素在模式文档中的其他地方 有定义。一般来说,ref 属性的值必须指向一个全局元素。通常是在引用定义的下面 单独声明的,而不是作为复合类型定义的一部分声明的。这个声明的结果为一个叫 comment 的元素可以出现在实例文档的关于这个定义的相关部分中, 它的元素名和内 容都必须和那个被引用的元素的类型一致。 (3) 约束元素的出现次数 我们看到,在前面的元素声明中 minOccurs 属性的值为 0 ,所以 comment 元素 在 PurchaseOrderType 类型中是一个可选项。minOccurs 表示元素最少出现次数,而 maxOcurrs 则表示元素的最多出现次数。当 minOccurs 的值为 1 时,一个元素就必须 出现。maxOccurs 属性值如果是“unbounded”表明不限出现的最大数量。minOccurs 和 maxOccurs 属性的默认值是 1。因此,当一个元素没有定义 maxOccurs 属性时,元素 出现不可以超过一次。如果你仅仅指定了 minOccurs 属性的值,它必须小于等于 maxOccurs 的默认值,也就是说 minOccurs 如果单独出现,其取值只能为 0 或者 1。 同样,如果你只指定了 maxOccurs 属性,它必须大于等于 minOccurs 的默认值,也就 是必须取值为 1 或者更多。 如果两个属性都被省略了, 那么元素必须出现且仅出现一 次。 而对于属性而言,它可以出现一次或者根本不出现,不会有其他的出现次数,所 以指定属性出现次数的语法与元素的语法有所不同。在属性声明中能够使用一个 use 属性来指明属性是否需要出现。 (4) 约束元素的缺省值 可以使用<xsd:element>元素的 fixed 或 default 属性(一次只能使用其中一个)来限

定元素的取值范围。例如,设置 fixed 为 400 表示元素值必须总是 400。而另一方面, 若设置 default 值为 400,则表示如果不为元素指定值,那么它的缺省值是 400。 (5) 约束属性 属性与元素不同,属性只能是简单类型,而且不能对属性使用 minOccurs 和 maxOccurs 约束。但是,可以使用<xsd:attribute>元素的 use 和 value 属性来对定义的 属性进行约束。 Use 属性可以指定是必须的(required)还是可选的(optional)。如果是可选的,use 属性可以指定固定的(fixed)还是存在缺省值(default)。 value 属性来存放所需的任意值。 下面是 use 属性的一些可能取值,如表 4.3 所示。 表4.3 use属性可能的取值

use属性取值 required optional fixed default





属性是必须的,可以为任意值

属性是可选的,可以为任意值,use属性的默认取值

属性是固定不变的,可以用value属性来指定属性值

如果属性未出现,它的值就是使用value属性设置的缺 省值;如果属性出现,它的值是文档中赋予它的值 属性禁止出现

Prohibited

例如,以下属性声明: <xsd:attribute name="counter" type="xsd:int" use="fixed" value="400"> 创建一个名位 counter 的整数类型的属性,它的值总是 400。 考虑以下属性声明: <xsd:attribute name="counter" type="xsd:int" use="default" value="400"> 它表示如果 counter 属性未使用,缺省值为 400,如果使用,它的值就是使用 时填写的。 2).简单类型(Simple Type) .简单类型 不包含任何子元素,但可以包含数字、字符串、日期等简单数据内容的元素称 为简单类型元素。简单类型包括原子类型(Atomic Types)、列表类型(List Type)和联 合类型(Union Type)三种。XML 模式规范已经预定义了很多简单类型。用户可以在 一定规则的指导下自定义简单类型, 但自定义的简单类型必须基于现有的简单类型, 这可能是规范已经预定义的简单类型或者是用户自定义的简单类型。 (1) 约束派生简单类型 一般我们通过重新约束一个已有的原始类型来引出一个新的简单类型。XML 模式规范定义了一些 facets 用于从数据取值范围、格式等方面对原子类型的取值加 以限制(restriction),从而产生一些新的简单类型。其中特别有用的有 minInclusive、 maxInclusive、pattern、enumeration 等。 我们使用 simpleType 元素来定义和命名新的简单类型。使用 restriction 元素来

约束派生定义类型,restriction 元素的 base 属性用来指出现有的基类型。 · minInclusive 和 maxInclusive。例如,我们希望建立一个新的整数类型称 为 myInteger,它基于原子类型 integer,取值范围为 100~999。清单如下: <xsd:simpleType name="myInteger"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="100"/> <xsd:maxInclusive value="999"/> </xsd:restriction> </xsd:simpleType> · pattern。pattern 元素通过正则表达式语言(Regular Expression Language)来 规定新定义类型的取值格式。清单如下: <xsd:simpleType name="SKU"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{3}-[A-Z]{2}"/> </xsd:restriction> </xsd:simpleType> · enumeration。enumeration 来定义一个新类型称为 sex,它由 string 引出 的,同时它的值必须为“男”或是“女”。清单如下: <xsd:simpleType name="sexType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="男"/> <xsd:enumeration value="女"/> </xsd:restriction> </xsd:simpleType> (2) 列表派生简单类型 XML 模式中的简单类型范畴中还有列表类型(List Type)的概念。 XML 模式有三 个内置的列表类型,它们是 NMTOKENS、IDREFS 和 ENTITIES。除了使用内置的 列表类型之外,还可以通过引用现有的原子类型来建立新的列表类型。 举例来说,我们可以建立一个名为 myInteger 的列表类型,并在实例文档中 使用它。清单如下: <xsd:simpleType name="listOfMyIntType"> <xsd:list itemType="myInteger"/> </xsd:simpleType> 下面是对应的实例文档部分: <listOfMyInt>20003 15037 95977 95945</listOfMyInt> 可以看出,列表类型的取值是以空格分割的若干原子类型值的组合。 一些用于描述的侧面也能够被应用到列表类型的定义中,它们是 length、minLength、maxLength 和 enumeration。 举例来说,如果我们想定义一个列表,这个列表中包含“红球”、“黄球”、“蓝 球”、“白球”、“黑球”中的 3 个。具体的定义清单如下: <xsd:simpleType name="colorfulBallListType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="红球"/>

<xsd:enumeration value="黄球"/> <xsd:enumeration value="蓝球"/> <xsd:enumeration value="白球"/> <xsd:enumeration value="黑球"/> <xsd:length value="3"/> </xsd:restriction> </xsd:simpleType> 对应的实例文档可以为 <colorfulBallList>白球 黄球 黑球</ colorfulBallList > 此时,我们可以从原子类型 string 导出一个列表类型。然而,在一个 string 中 也许会带有空格, 而空格在一个列表类型实例中是作为分隔符使用的。 所以当在使 用基类型为 string 的列表类型时,应当格外小心。 (3) 联合派生简单类型 一个联合类型(Union Type)可以包含多个原始类型或者列表类型,而应用了联 合类型的元素或是属性的值可以是这些原始类型或列表类型中的任一个类型的实 例。清单如下: <xsd:simpleType name="myUnionType"> <xsd:union memberTypes="sexType colorfulBallListType"/> </xsd:simpleType> 3).匿名类型(Anonymoustype) 到目前为止, 我们在模式中使用的所有元素都使用了 type 属性以指示新的元 素类型。 但是如果只想使用一个类型一次, 有必要对元素进行声明并为其命名吗? 在这种情况下,我们使用匿名类型定义。 5 模式结构的组织 1).元素内容模型 . 模式文档中包含很多种的元素类型定义。 有的元素包含其他元素, 有的元素包 含其他元素和属性, 也有的元素包含一个简单类型值, 同时也有元素和文本内容混 合在一起的元素。本节我们来讨论元素的内容模型。 (1) 简单内容模型 让我们首先考虑一下, 如何声明包含了一个属性, 同时拥有简单类型值的元素。 在一个实例文档中,此类元素就像下面的形式: <myPrice currency="RMB">423.46</myPrice> 让我们从购买订单模式文档中的 Price 元素声明开始: <xsd:element name="myPrice" type="decimal"/> 如何为这个元素定义添加一个属性呢?简单类型不能有属性,而 decimal 是简 单类型。因此,必须定义一个复合类型来携带属性声明。然而,我们也想同时具有 简单类型 decimal 的元素内容。所以我们最初的问题转化为如何定义一个基于简单 类型 decimal 的复合类型。程序的清单如下: <xsd:element name="myPrice"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:decimal">

<xsd:attribute name="currency" type="xsd:string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> (2) 混合内容模型 在混合内容模型中, 元素中可以混合文本数据和嵌套子元素。 考虑下面的程序 清单使用 XML 表示的客户信笺的片断。清单如下: <letterBody> <salutation>Dear Mr.<name>Robert Smith</name></salutation> Your order of <quantity>1</quantity> <productName>Baby Monitor</productName> shipped from our warehouse on <shipDate>1999-05-21</shipDate> .... </letterBody> 请注意在元素之间的文本和子元素。在这里,文本出现在元素 salutation、 quantity、productName 和 shipDate 之间,这些元素都是 LetterBody 的子元素,并 且在 letterBody 子孙元素 name 旁边也有文本出现。 下面是对该文档的模式进行的定义,清单如下: <xsd:element name="letterBody"> <xsd:complexType mixed="true"> <xsd:sequence> <xsd:element name="salutation"> <xsd:complexType mixed="true"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="quantity" type="xsd:positiveInteger"/> <xsd:element name="productName" type="xsd:string"/> <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/> <!-- etc. --> </xsd:sequence> </xsd:complexType> </xsd:element> 注意到在 XML 模式中, 混合内容模型与 XML DTD 的混合模式有着根本的区 别。 XML 模式下面的混合模型, 在 子元素在一个实例中出现的顺序和数量必须与 子元素在模型中说明的顺序和数量一致。与之相对,在 XML DTD 混合模型下,出 现在实例中的子元素的顺序和数量不能被限制。可见,XML 模式提供了充分的混 合模型的校验。 (3) 空模型 假设我们想让 myPrice 元素用属性值来传送货币的单位和价格, 而不是像先前

用一个属性值以及元素内容值那样来表示。例如: <myPrice currency="RMB" value="423.46"/> 这样的元素的内容模型是空。 为了定义内容是空的元素, 我们可以通过这样的 方式:首先我们定义一个元素,它只能包含子元素而不能包含元素内容;然后我们 又不定义任何子元素,用这种方式,我们就能够定义出内容模型为空的元素。清单 如下:

<xsd:element name=" myPrice"> <xsd:complexType> <xsd:complexContent> <xsd:restriction base="xsd:anyType"> <xsd:attribute name="currency" type="xsd:string"/> <xsd:attribute name="value" type="xsd:decimal"/> </xsd:restriction> </xsd:complexContent> </xsd:complexType> </xsd:element> 在上面的例子中,我们定义了一个匿名类型,它包含的是 complexContent,即 只包含子元素。 complexContent 元素表明我们想要约束或者扩展一个复合类型的内 容模型,并且类型为 anyType 的 restriction 元素声明了两个属性,而没有引入任何 元素内容。 使用这种方法声明的 myPrice 元素就得以像上面例子里所显示的那样出 现在实例文档中。 我们可以通过更简洁的声明方式来声明 myPrice 元素。清单如下: <xsd:element name="myPrice"> <xsd:complexType> <xsd:attribute name="currency" type="xsd:string"/> <xsd:attribute name="value" type="xsd:decimal"/> </xsd:complexType> </xsd:element> 因为一个不带有 simpleContent 或者 complexContent 的复合类型定义,会被解 释为带有类型定义为 anyType 的 complexContent,这是一个默认的速记方法,所以 这个简洁的语法可以在模式处理器中正常工作。 (4) 任意模型 anyType 是导出所有简单类型和复合类型的基类型。不约束其包含内容例如: <xsd:element name="anything" type="xsd:anyType"/> 用这种方式声明的元素是不受约束的。 所以元素的值可以为 423.46, 也可以为 任何其他的字符序列,或者甚至是字符和元素的混合。实际上,anyType 是默认类 型,所以上面的可以被重写为 <xsd:element name="anything"/> 2).注释 . 为了方便读者和应用程序理解模式文档, XML 模式提供了三个元素用作注释: <xsd:annotation>元素实际包含了<xsd:documentation>和<xsd:appInfo>元素。

<xsd:documentation>存储普通类型的注释文本,即为阅读模式的人设计的文本。 <xsd:appInfo>元素存储有助于应用程序阅读模式的注释, 应用程序可以从中选择有 用的信息。 以下例子使用了<xsd:annotation>和<xsd:documentation>元素,清单如下: <xsd:annotation> <xsd:documentation > I am very happy! </xsd:documentation > < /xsd:annotation > 6 从 Xml 文档内部引用 Xml Schema 验证 在创建了一个 Xml Schema 文档之后,就可以用它来验证 xml 文档的有效性了。做起 来很简单, 只需要在 xml 文档根元素内引用该 schema 文件就可以了。 不过, 根据 xml schema 文档是否包含 targetNamespace 属性,xml 文档内的引用有以下两种方式: 1、使用 noNamespaceSchemaLocation 属性引用 schema 文件 当 xml schema 文档不包括 targetNamespace 属性时,应当通过 xml 文档根元素的 noNamespaceSchemaLocation 属 性 及 W3C 的 schmea 实 例 命 名 空 间 (xmlns:xsi="http://www.w3.org/2001/XMLScheam-instance";)来引用名 xml schema 文件。下面 的例子引用不包含"targetNamespace"属性的名为"noTargetNS.xsd"的架构文件: <?xml version="1.0" encoding="utf-8" ?> <Employees Xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="noTargetNS.xsd"> <Name>LinY</Name> <Age>42</Age> </Employees> 2、使用 schemaLocation 属性引用 schema 文件 然而,如果 xml schmea 文件包含了一个 targetNamespace 属性,在 xml 文档中就将通 过 schemaLocation 属性而不是 noNamespaceSchemaLocation 属性来引用 schema 文档。 而且, 这个属性所指定的值必须是完整的。它需要包含以空格分开的两部分,前一部分是 Uri,这 个 Uri 与 schema 文档的 targetNamespace 属性内部引用的 Uri 是一致的; 后一部分是 schema 文 件 完 整 路 径及 名 称 。另 外 ,Xml 文 档 的 根 元 素 也 必 须 声明 schema 实 例 名 字 空间 (xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";) , 下 面 的 例 子 引 用 包 含 "targetNamespace"属性的名为 yesTargetNS.xsd 架构文件: <?Xml version="1.0" encoding="utf-8" ?> <Employees Xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xsi:schemaLocation="http://www.tuha.net yesTargetNS.xsd" Xmlns="http://www.tuha.net";> <Name>XiaoM</Name> <Age>25</Age> </Employees>

在 xml 文档内部正确地引用 schema 文件之后,在解析 xml 文档时将执行验证。

4.6 XML 文档的显示 我们知道, HTML 中的标记主要用来说明 HTML 文档在浏览器中的显示格式, 所以 HTML 文档的显示格式基本是固定的。 XML 中的标记是开发者自己定义的, 而 主要用来说明 XML 程序文档所表述的数据的内在结构关系。这样一来,XML 程序 文档的显示格式就需要用另外的机制来定义。层叠样式单(CSS,Cascading Style Sheet)和扩展样式单语言(XSL,eXtensible Style sheet Language)是 W3C 推荐的表达 XML 文档数据显示格式的两种标准。 1、 层叠样式单(CSS) 层叠样式单最早是为方便 HTML 语言而提出的, 使用层叠样式单能保证文档显 示格式的一致性和较好的格式化,在 XML 中使用层叠样式单可以方便开发人员为 自定义的元素和标记定义其显示格式。通过层叠样式单可以产生上百种显示格式信 息,例如字体、颜色、位置等。层叠样式单的功能虽不如扩展样式单语言强,但其 实现和开发过程相对容易得多。 2

扩展样式单语言(XSL) CSS 是一种静态的样式描述格式,其本身不遵从 XML 的语法规范。扩展样式 单语言(XSL,eXtensible Style sheet Language)不同,它遵守 XML 的语法规则,是 XML 的一种具体应用。这就是说,XSL 本身就是一个 XML 文档,系统可以使用同 一个 XML 解释器对 XML 文档及其相关的 XSL 文档进行解释处理。 XSL 语言已经被分割成三个不同的部分: (1) 转换工具(XSLT,XSL Transformations)。它描述了如何将一个没有形式表 现的 XML 文档内容进行转换,转换为可浏览或可输出的格式。 (2) 格式对象 FO(Formatted Object)。 (3) XML 分级命令处理工具 XPath。 一个 XML 文档的显示过程是这样的: 首先根据 XML 文档构造源树;然后根据 给定的 XSL 将这个源树转换为可以显示的结果树,这个过程称作树转换;最后再按 照 FO 解释结果树,产生一个可以在屏幕上、纸上、语音设备或其他媒体中输出的 结果,这个过程称作格式化。 描述树转换的这一部分协议日趋成熟, 已从 XSL 中分离出来, 另取名为 XSLT, 其正式推荐标准于 1999 年 11 月 16 日已公布,现在一般所说的 XSL 大都指的是 XSLT。与 XSLT 一同推出的还有其配套标准 XPath,这个标准用来描述如何识别、 选择、匹配 XML 文档中的各个构成元件,包括元素、属性和文字内容等。 1)XSLT

如前所述, XSLT 主要的功能就是转换, 它将一个 XML 内容文档作为一个源树, 将其转换为一个有样式信息的结果树。在 XSLT 文档中定义了与 XML 文档中各个 逻辑成分相匹配的模板,以及匹配转换方式。 下面让我们来看一个 XSLT 的简单例子。通过剖析这个例子,对 XSLT 的基本 语法和功能有一个了解,程序清单如下:

<?xml version="1.0" encoding="gb2312" ?> <?xml-stylesheet type="text/xsl" href="mystyle.xsl"?> <roster> 花名册 <student> <name>刘鹃</name> <origin>湖北</origin> <age>20</age> <telephone>8207423</telephone> </student> <student> <name>王磊</name> <origin>广东</origin> <age>21</age> <telephone>8205632</telephone> </student> </roster> 可以看出,在 XML 中声明 XSL 样式单的格式是: <?xml-stylesheet type="text/xsl" href="样式单文件名"?>

其程序清单如下: <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/REC-html40"> <xsl:template> <xsl:apply-templates/> </xsl:template> <xsl:template match="/"> <HTML> <HEAD> <TITLE>学生花名册</TITLE> <STYLE> .title{font-size:15pt; font-weight:bold; color:blue } .name{color:red} </STYLE>

</HEAD> <BODY> <P class="title" >花名册</P> <xsl:apply-templates select="roster"/> </BODY> </HTML> </xsl:template>

<xsl:template match="roster"> <TABLE BORDER="1"> <THEAD> <TD> <B>姓名</B> </TD> <TD> <B>籍贯</B> </TD> <TD> <B>年龄</B> </TD> <TD> <B>电话</B> </TD> </THEAD> <xsl:for-each select="student" order-by="name"> <TR> <TD><B><xsl:value-of select="name"/></B></TD> <TD><xsl:value-of select="origin"/></TD> <TD><xsl:value-of select="age"/></TD> <TD><xsl:value-of select = "telephone"/></TD> </TR> </xsl:for-each> </TABLE> </xsl:template> </xsl:stylesheet> 为看懂上例中的 XSL 源码,首先介绍一下 XSL 的几条主要语句。 (1) xsl:stylesheet:声明语句; (2) xsl:template:相当于编程中函数的概念; (3) xsl:template match = "":相当于函数调用,去匹配引号中指定的节点; (4) xsl:apply-templates:应用模板函数; (5) xsl:apply-templates select ="":应用模板函数的调用,跳转到引号中指定 的模板; (6) xsl:for-each select = "":循环语句,遍历与引号中的属性值相同的节点; (7) xsl:value-of select = "":赋值语句,取出引号中指定的属性值。 知道了上面这些语句的含义, 我们就可以分析一下这段 XSLT 源代码的执行过 程了,整个过程如图 4.9 所示。 在 作 过 XML 声 明 和 XSL 声 明 之 后 , 样 式 单 利 用 <xsl:template> <xsl:apply-templates/> </xsl:template>声明 XSL 模板,并调用该模板。

/

html

roster

head

body

title student

lable

学学学的学

thead

tbody

name

origin

age

tele

td

td

td

td

tr

td

td

td

td

图4.9 XSLT转换过程 根据<xsl:apply-templates/>,系统最先匹配 XML 源树的根节点。根节点用“/”表示, 它的匹配方法在一对<xsl:template match="/">括起的源码中声明。按照这段代码,首 先生成带有样式信息的 HTML 文档的开头一段代码程序,清单如下: <HTML> <HEAD> <TITLE>学生花名册</TITLE> <STYLE> .title{font-size:15pt; font-weight:bold; color:blue } .name{color:red} </STYLE> </HEAD> <BODY> <P class="title" >花名册</P> 下面, 系统看到了<xsl:apply-templates select="roster"/>的指示, 于是, 它在 XML 源树中寻找标记为“roster”的节点进行匹配。就像函数调用一样,现在系统跳到了用 <xsl:template match="roster">括起的“函数”中继续生成下面的 HTML 代码,程序清 单如下: <TABLE BORDER="1"> <THEAD> <TD> <B>姓名</B> </TD> <TD> <B>籍贯</B> </TD> <TD> <B>年龄</B> </TD> <TD> <B>电话</B> </TD> </THEAD>

现在,系统又接到了新的指示 <xsl:for-each select="student" order-by="name">。 这条指示要求系统寻找标记为“student”的子节点,并按照“name”下的内容将这些节 点排序,然后一一处理。对于每一个“student”子树中的内容,系统为其生成表中一 行的内容。每一行包含四列,分别把标记为“name”、“origin”、“age”和“telephone” 的子节点的内容填进去。其中“name”下的内容是粗体显示。对应到本例中的 XML 数据,生成的 HTML 代码,程序清单如下: <TR> <TD><B>刘鹃</B></TD> <TD>湖北</TD> <TD>20</TD> <TD>8207423</TD> </TR> <TR> <TD><B>王磊</B></TD> <TD>广东</TD> <TD>21</TD> <TD>8205632</TD> </TR>

图4.10 XML文档在IE中的显示

处理完<xsl:for-each select="student" order-by="name">中的内容,系统继续生成 HTML 代码: </TABLE> 至此,系统已处理完<xsl:template match="roster">中的所有内容,可以“函数返 回”了。系统返回到<xsl:template match="/">括起的源码中,完成 HTML 最后两行代 码的生成:

</BODY> </HTML> 把上面的 HTML 代码串起来,就是生成的转换结果文件,它在 IE5 中的浏览效 果如图 4.10 所示。 2)FO ) FO(Formatting Object)又称为格式对象,它直接面向文档内容的显示格式。FO 定义了一个字典,或称之为符号集。在字典中都是关于排版格式的一些关键字,再 配上定义的 XSL 属性,便可表达出各种显示信息。在此,我们只作简要介绍。 FO 文档格式也是 XML 格式,遵从 XML 语法规范。它的命名空间是 fo,声明 如下: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0"> FO 的基本单位是称之为 area 的矩形区,area 内可以包含文本、图像或其他的 格式对象。在 XSL 中定义了 50 多个格式对象,并定义了更多的属性,对象加属性 可以描述各种显示版面。

3.XPath 从上面的例子可以看出, 在利用 XSL 进行转换的过程中, 匹配的概念非常重要。 在模板声明语句 xsl:template match = ""和模板应用语句 xsl:apply-templates select = "" 中,用引号括起来的部分必须能够精确地定位节点。具体的定位方法则在 XPath 中 给出。 之所以要在 XSL 中引入 XPath 的概念,是为了在匹配 XML 文档结构树时能 够准确地找到某一个节点元素。可以把 XPath 比作文件管理路径:通过文件管理路 径,可以按照一定的规则查找到所需要的文件;同样,依据 XPath 所制定的规则, 也可以很方便地找到 XML 结构文档树中的任何一个节点,显然这对 XSLT 来说是 一个最基本的功能。 不过,由于 XPath 可应用于不止一个的标准,因此 W3C 将其独立出来作为 XSLT 的配套标准发布,它也是 XPointer 的重要组成部分。

4.7 XML 实例 1 DTD: 1)完整的 文档, 1)完整的 DTD 文档,写 XML 实例 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE newspapre[ <!ELEMENT newspapre (article+)> <!ELEMENT article (headline,byline,lead,body,notes)> <!ELEMENT headline (#PCDATA)> <!ELEMENT byline (#PCDATA)> <!ELEMENT lead (#PCDATA)> <!ELEMENT body (#PCDATA)> <!ELEMENT notes (#PCDATA)> <!ATTLIST article AUTHOR CDATA #REQUIRED> <!ATTLIST article EDITOR CDATA #IMPLIED> <!ATTLIST article DATE CDATA #IMPLIED> <!ATTLIST article EDITION CDATA #IMPLIED> <!ENTITY newspapre "Vervet Logic Times"> <!ENTITY publisher "Vervet Logic Press"> <!ENTITY copyright "Copyright 1998 Vervet Logic Press"> ]>

<newspapre> <article AUTHOR="xxx" EDITOR="aaa" DATE="xxxx-xx-xx" EDITION="sss"> <headline>&newspapre;</headline>

<byline>&publisher;</byline> <lead>newspapre</lead> <body> ddddddddddd </body> <notes>&copyright;</notes> </article> <article AUTHOR="XXX" EDITOR="AAA" DATE="xxxx-xx-xx" EDITION="SSS"> <headline>&newspapre;</headline> <byline>&publisher;</byline> <lead>newspapre</lead> <body> 这是一个新闻! </body> <notes>&copyright;</notes> </article> </newspapre>

2)分析 实例, 2)分析 XML 实例,写 DTD 文档 <?xml version="1.0"?> <!DOCTYPE 学生名册[ <!ELEMENT 学生名册 (学生*)> <!ELEMENT 学生 (姓名,性别,年龄)> <!ATTLIST 学生 学号 CDATA #REQUIRED> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT 性别 (#PCDATA)> <!ELEMENT 年龄 (#PCDATA)> ]>

<学生名册> <学生 学号="1"> <姓名>张三</姓名> <性别>男</性别> <年龄>20</年龄> </学生> <学生 学号="2"> <姓名>李四</姓名> <性别>女</性别> <年龄>19</年龄> </学生> <学生 学号="3"> <姓名>王二</姓名> <性别>男</性别>

<年龄>21</年龄> </学生> </学生名册> 3)熟悉 元素、属性及实体的运用, 的方法, 3)熟悉 DTD 元素、属性及实体的运用,掌握引用 DTD 的方法,

根据以上的图书信息管理系统的标记结构图,设计完成以下内容: (1) 分别设计作者、书籍、出版社信息的DTD 语句; (2) 使用外部实体的方式设计系统的DTD 文档; (3) 根据设计好的DTD 文档,编写XML 文档; (4) 生成完整的 XML 文档

1、图书信息管理的DTD文档定义 (1) 程序code4_18_1.dtd,与作者相对应的DTD 片段。
<?xml version="1.0" encoding="gb2312" ?> <!ELEMENT authors (author*)> <!ELEMENT author (a_name,sex,email*)> <!ATTLIST author id ID #REQUIRED> <!ATTLIST author ISBN IDREFS #REQUIRED> <!ELEMENT a_name (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ELEMENT email (#PCDATA)>

作者信息中authors 根元素下有author 子元素,author 子元素又包含了a_name、sex、 email 这3 个子元素,其中email 子元素可有可无,也可有数个。author 子元素有两个属性, 分别为作者的ID 和作者所编书籍的ISBN,且这两个属性的属性值必须指定。 (2) 程序 code4_18_2.dtd,与书籍相对应的 DTD 片段。
<?xml version="1.0" encoding="gb2312" ?> <!ELEMENT books (book*)> <!ELEMENT book (b_name,price)> <!ATTLIST book ISBN ID #REQUIRED>

<!ELEMENT b_name (#PCDATA)> <!ELEMENT price (#PCDATA)>

书籍信息中books 根元素下有book 子元素,book 子元素又包含了b_name、price 两个 子元素。book 子元素有一个属性,即书籍的ISBN,且这个属性的属性值必须指定。 (3) 程序code4_18_3.dtd,与出版社相对应的DTD 片段。
<?xml version="1.0" encoding="gb2312" ?> <!ELEMENT publishers (publisher*)> <!ELEMENT publisher (p_name,address)> <!ATTLIST publisher ISBN IDREFS #REQUIRED> <!ELEMENT p_name (#PCDATA)> <!ELEMENT address (#PCDATA)>

作者信息中publishers 根元素下有publisher 子元素,publisher 子元素又包含了p_name、 address 两个子元素。publisher 子元素有一个属性,即其出版社所印书籍的ISBN,且这个属 性的属性值必须指定。 2、系统DTD 文档 程序code4_18.dtd,XML 文档直接引用的DTD。
<?xml version="1.0" encoding="gb2312" ?> <!ELEMENT volume (authors|books|publishers)*> <!ENTITY % author SYSTEM "code4_4.dtd"> %author; <!ENTITY % book SYSTEM "code4_5.dtd"> %book; <!ENTITY % publisher SYSTEM "code4_6.dtd"> %publisher;

在XML 文档直接引用的DTD 中,用到外部参数实体,从而将作者、书籍、出版社相 对应的 DTD 片段与 XML 文档直接引用的 DTD 组成一个整体,以便 XML 主文档的引用。 3、XML 文档片段 程序code4_18_1.xml,作者信息XML 文档片段。
<?xml version="1.0" encoding="gb2312" ?> <authors> <author id="a0001" ISBN="ISBN7-04-014768-8"> <a_name>丁跃潮</a_name> <sex>男</sex> <email> ding@jmu.edu.cn</email> </author> <author id="a0002" ISBN="ISBN7-113-05892-2"> <a_name>龚涛</a_name> <sex>男</sex> </author> </authors>

程序code4_18_2.xml,书籍信息XML 文档片段。
<?xml version="1.0" encoding="gb2312" ?> <books> <book ISBN="ISBN7-04-014768-8">

<b_name>计算机导论</b_name> <price>19.7</price> </book> <book ISBN="ISBN7-113-05892-2"> <b_name>PowerBuilder 入门教程</b_name> <price>48.0</price> </book> </books>

程序code4_18_3.xml,出版社信息XML 文档片段。
<?xml version="1.0" encoding="gb2312" ?> <publishers> <publisher ISBN="ISBN7-04-014768-8"> <p_name>高等教育出版社</p_name> <address>北京市东城区沙滩后街55 号</address> </publisher> <publisher ISBN="ISBN7-113-05892-2"> <p_name>中国铁道出版社</p_name> <address>北京市宣武区右安门西街8 号</address> </publisher> </publishers>

4、生成完整的XML 文档 程序code4_18.xml,XML 主文档。
<?xml version="1.0" encoding="gb2312" ?> <!DOCTYPE volume SYSTEM "code4_18.dtd"[ <!ENTITY authors SYSTEM "code4_18_1.xml"> <!ENTITY books SYSTEM "code4_18_2.xml"> <!ENTITY publishers SYSTEM "code4_18_3.xml">]> <volume> &authors; &books; &publishers; </volume>

在XML 主文档中运用了外部一般实体,将作者、书籍、出版社信息的XML 文档片段与主 文档联系起来, 并将主文档与系统DTD 文件关联在一起, 以组成一个结构完整的XML文档。 运行程序code4_18.xml,最终显示结果如图所示。

实例: 2 XML Schema 实例 让然然让让这我的元 "shiporder.xml" 的 XML 文文: <?xml version="1.0" encoding="ISO-8859-1"?> <shiporder orderid="889923" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="shiporder.xsd"> <orderperson>George Bush</orderperson>

<shipto> <name>John Adams</name> <address>Oxford Street</address> <city>London</city> <country>UK</country> </shipto> <item> <title>Empire Burlesque</title> <note>Special Edition</note> <quantity>1</quantity> <price>10.90</price> </item> <item> <title>Hide your heart</title> <quantity>1</quantity> <price>9.90</price> </item> </shiporder> 上面的XML文档包括根元素 "shiporder",其中包含必须名为 "orderid" 的属性。"shiporder" 元素包含三个不同的子元素:"orderperson"、"shipto"以及"item"。"item"元素出现了两次,它 含有一个 "title"、一个可选 "note" 元素、一个 "quantity" 一个 "price" 元素。上面这一行 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance", 告知XML解析器根据某个 schema 来验证此文档。这一行:xsi:noNamespaceSchemaLocation="shiporder.xsd"规定了schema的位 置(在这里,它与 "shiporder.xml" 处于相同的文件夹) 。 创建一个 XML Schema 现在,我们需要为上面这个XML文档创建一个schema。我们可以通过打开一个新的文件来开 始,并把这个文件命名为 "shiporder.xsd"。要创建schema,我们仅仅需要简单地遵循 XML文档中的结构,定义我们所发现的每个元素。首先我们开始定义一个标准的XML 声明: <?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> ... </xs:schema> 现在在的 schema 中,然然我我元我我的的的的的 (xs),此此的的的的相相相的 URI 这 Schema的的的元元(Schema language definition),这我我定这 http://www.w3.org/2001/XMLSchema)接接接,然然然然元元 "shiporder" 元元)此元元 拥拥拥我这这,这中这这这这的元元,这此然然因这的元元我我元元)"shiporder" 元元的 子元元此 xs:sequence 元元这元,元元元子元元的属定: <xs:element name="shiporder"> <xs:complexType> <xs:sequence> ... ... </xs:sequence> ...

</xs:complexType> </xs:element> 然然然然然然然"orderperson"元元元元元元元元元(这这这元这这这这这这这这这这这这 的元元))元元(xs:string)的的的这的的的的的的的的规元的, 此的的的的此此此此元元的 schema 数数元元的 XML schema 相相相: <xs:element name="orderperson" type="xs:string"/> 接接接,然然然然我我元元元元元我我元元:"shipto" 和 "item")然然我元元 "shipto" 元元元元: <xs:element name="shipto"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="address" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> 通通schema,然然我我我maxOccurs和minOccurs这这接元元属我元元我属属属的属数) maxOccurs元元属元元属属属数的定定定,而minOccurs 则元元属元元属属属数的定则定) maxOccurs和minOccurs的的的定的这1!属现,然然我我元元"item"元元元) 这我元元我现 "shiporder" 元元元元属属元属)这这通通然 "item" 元元的 maxOccurs 这这的定属元元 "unbounded"接来属的,这这"item"元元元我属属元元这元元元的这元元属)请请元,"note" 元元这我元元元)然然我我然此元元的 minOccurs 这这属元元 0 元: <xs:element name="item" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="note" type="xs:string" minOccurs="0"/> <xs:element name="quantity" type="xs:positiveInteger"/> <xs:element name="price" type="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:element> 现在, 我们可以声明 "shiporder" 元素 的属性了。由于这 是一个必选属性,我们 规定 use="required"。请注:此这这的此此此此此此此定然: <xs:attribute name="orderid" type="xs:string" use="required"/> 这这这我的元 "shiporder.xsd" 的 schema 文文的文文文文: <?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder"> <xs:complexType> <xs:sequence> <xs:element name="orderperson" type="xs:string"/> <xs:element name="shipto"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="address" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="item" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="note" type="xs:string" minOccurs="0"/> <xs:element name="quantity" type="xs:positiveInteger"/> <xs:element name="price" type="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="orderid" type="xs:string" use="required"/> </xs:complexType> </xs:element> </xs:schema>


xml学习笔记.doc

xml学习笔记 - 学习必备 欢迎下载 XML 学习笔记 1.eXtensible Markup Language(可扩展标记语言)。 2.为什么要学习 XML: 数据交换的需要,电子商务的...

XML学习笔记.doc

XML学习笔记_计算机软件及应用_IT/计算机_专业资料。适合初学者瞅瞅~XML 入门经典第四版(使用软件 Stylus Studio) 第一章:什么是 XML HTML:超文本标记语言(HyperTe...

XML学习笔记01.pdf

XML学习笔记01 - XML 教程 ? Next Page XML 指可扩展标记语言 XML 被设计用来传输和存储数据。 在我们的 XML 教程中,你将了解什么是 XML,以及 XML 与 H...

XML复习笔记.doc

XML复习笔记 - XML 复习分 3 部分 第一部分:XML 的用途:1.简化数据的共享 2.简化数据的传输。3.简化平台的变更 第二部分:XML 的语法:有 8 点。 1. XML...

xml 笔记.doc

xml 笔记 - 韩顺平 xml 教程课堂ppt+课堂笔记... xml 笔记_其它语言学习_外语学习_教育专区。韩顺平 xml 教程课堂ppt+课堂笔记 ? Xml 简单的历史介绍 1969 gml(...

XML学习笔记(一).doc

XML课堂学习笔记 1页 免费 xml学习笔记(圣思园) 4页 免费 XML学习笔记之基础知识 2页 免费 07.Xml学习笔记 8页 免费喜欢此文档的还喜欢 XML教程 67页 免费 ...

xml笔记.doc

xml笔记_工学_高等教育_教育专区。xml笔记 1 XML 入门 1.1 引入 HTML: ...方案二: 教师信息只在教学管理系统中维护。 3 XML 语法 xml 文件以 xml 后缀...

XML入门基础学习笔记.doc

XML入门基础学习笔记 - XML 入门基础学习笔记 入门基础学习笔记 一.XML 的编辑工具 Notepad UltraEdit XMLSpy 在 http://www.xmlspy.com ...

8---XML学习笔记.doc

8---XML学习笔记 隐藏>> XML 目 录 一、 XML 基本语法 ... 1 1.1 XML 介绍 ......

XML全套详细笔记_js.pdf

XML全套详细笔记_js - 目录 一、 什么是XML...

XML全套详细笔记(心血放出).doc

XML全套详细笔记(心血放出)_计算机软件及应用_IT/计算机_专业资料 309人阅读|15次下载 XML全套详细笔记(心血放出)_计算机软件及应用_IT/计算机_专业资料。学习...

XML学习笔记之基础知识.txt

XML学习笔记之基础知识 - XML是Web开发中常用的存储数据的文档,所以我们必须对它有一定的了解。这是本人学习XML时的笔记,分为三个部分,这是第一部分,基础知识,...

Xml学习笔记1.doc

Xml学习笔记1 - Xml 学习笔记(一)基础篇 学习笔记( Preface:本文是 W3CSchools 上《XML 指南》基础篇的学习笔记。其中大部分 内容是对指南的翻译总结。由于原文...

XML基础笔记 2_图文.doc

XML基础笔记 2 - XML 基础教程 2 DTD 入门 1. 有效的 XML 文档(valid) 。首先 XML 文档是个格式正规的 XML 文档,然 后又需要满足 DTD 的要求,这样的 ...

XML-intro,笔记,教程,教案_图文.ppt

XML-intro,笔记,教程,教案 - XML ? XML基础 XML概览 XML应用简介 第一个XML文档 数据的结构化 特性、空标记和XSL 结构完整的XML文档 为什...

关于xml的一些笔记.txt

关于xml的一些笔记 - 工具 用XMLSpay 编辑xml xml: eXte

xml笔记一(xml基础).txt

xml笔记一(xml基础) - 一、XML简介 1、定义 (1)、XML 全名是

XML笔记.txt

XML笔记 - 约束 DTD !DOCTYPE !ELEMENT 元素 !ATT

韩顺平xml笔记.doc

韩顺平xml笔记 - ? 一、Xml 简单的历史介绍 1969 gml(通用标记

xml笔记.txt

xml笔记 - DTD语法细节:元素定义2 元素内容中可以使用如下方式,描述内容