XML应用体系结构 Application DOM SAX DOM4J XPath XSL XLink XML Namespace XML Specification XML Schema (DTD)
DTD文档:contact.dtd XML文档:list.xml <?xml version="1.0" encoding=" GB2312 " ?> <!DOCTYPE list SYSTEM “contact.dtd"> <list> <联系人> <姓名>张三</姓名> <ID>001</ID> <公司>A公司</公司> <email>zhang@aaa.com</email> <电话>(010)62345678</电话> <地址> <省份>北京</省份> <城市>北京</城市> <街道>五街1234号</街道> </地址> </联系人> </list> <?xml version="1.0" encoding="GB2312"?> <!ELEMENT list (联系人)*> <!ELEMENT 联系人 (姓名,ID,公司,email,电话,地址)> <!ELEMENT 地址 (省份,城市,街道)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT ID (#PCDATA)> <!ELEMENT 公司 (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ELEMENT 电话 (#PCDATA)> <!ELEMENT 街道 (#PCDATA)> <!ELEMENT 城市 (#PCDATA)> <!ELEMENT 省份 (#PCDATA)>
XSL文档 将XML文档中的<姓名>标签转换为HTML中的<UL>标签; <?xml version="1.0" encoding="GB2312"?> <xsl:stylesheet xmlns:xsl=http://www.w3.org/TR/WD-xsl …> <xsl:template><xsl:apply-templates/></xsl:template> <xsl:template match = "/"> <HTML> <HEAD><TITLE>F公司的客户联系信息</TITLE> </HEAD><BODY> <xsl:apply-templates select="联系人列表"/></BODY></HTML> </xsl:template> <xsl:template match = "联系人列表"> <xsl:for-each select="联系人"> <UL> <LI><xsl:value-of select="姓名"/></LI> <UL> <LI>用户ID:<xsl:value-of select="ID"/></LI> <LI>公司: <xsl:value-of select="公司"/></LI> <LI>EMAIL: <xsl:value-of select=“email"/></LI> <LI>电话: <xsl:value-of select="电话"/></LI> </UL> </UL> </xsl:for-each> </xsl:stylesheet> 将XML文档中的<姓名>标签转换为HTML中的<UL>标签; 将XML文档中的 <ID>、<公司>、<email>、<电话>等标签转换为HTML中的< LI>标签。
第二章 XML语言 第一节 XML概述 第二节 XML语法 第三节 DTD 第四节 Schema 第五节 Namespace 第六节 XSL 第八节 其他
第四节 schema schema介绍 schema规范 schema应用
Schema及其发展 Schema起源 DTD存在许多缺陷,如: W3C成员先后提交5个schema: XML-Data 不支持多种数据类型 扩展性较差等。 W3C成员先后提交5个schema: XML-Data DCD(Document Content Description for XML) SOX(Schema for Object-Oriented XML)、 DDML(Document Definition Markup Language) XML Schema。
XML-Data 1998年由微软等公司发起,首次引入Schema概念。 提供一种在Web上描述和交换结构化和网络化数据的规范,并描述了XML Schema数据字典。
DCD(Document Content Description for XML) 1998年由IBM、微软共同发起。 目的是用XML语法规范来定义XML文档结构,以取代DTD。
SOX(Schema for Object-Oriented XML) 1998年由Veo Systems Inc发起, 提出一种Schema规范,支持对XML文档的结构、内容和语义进行严格定义。 提供一些诸如基本数据类型和扩展数据类型机制、内容模型和属性接口继承机制、高效命名空间机制、嵌入式文档等等。
DDML(Document Definition Markup Language,又叫XSchema、XSD) 1999年由xml-dev提交W3C。 DDML只是对DTD的逻辑结构进行了重新定义,使得Schema文档可以被众多XML工具所编辑。
XML Schema (http://www.w3.org/XML/Schema) 2001年W3C推荐XML Schema 取重家之长。 XML Schema分为三部分: 第一部分 总体介绍(XML Schema Part 0: Primer) 帮助读者快速理解利用Schema语法创建Schema文档; 第二部分(XML Schema Part 1: Structure) 为描述XML1.0文档的结构和内容约束提供了文档, 第三部分(XML Schema Part 2: Datatypes) 为Schema及其他XML规范定义了数据类型。
XML Schema特点 一致性 扩展性 易用性 Schema书写语法和XML文件相同,清晰直观 DTD结构和XML文件不同,需要单独学习DTD Schema。 扩展性 DTD定义的数据类型有限。 Schema可以定义多样数据类型。 易用性 Schema可以沿用XML编辑工具、解析工具、应用工具 如DOM、SAX。 DOM、SAX等不支持DTD。
XML Schema特点 规范性 互换性 Schema也提供了一套完整机制以约束XML文档中置标的使用,比DTD更具有规范性.
第四节 schema Schema介绍 Schema规范 Schema应用
一个XML Schema实例 [1] <?xml version="1.0"? Encoding=“GB2312”> [2] <xs:schema [3] xmlns:xs="http://www.w3.org/2001/XMLSchema" [4] targetNamespace="http://www.book.com.cn" [5] elementFormDefault="qualified"> [6] attributeformDefault=“unqualified” /> [7] <xs:element name=“图书“ type=“xs:string”> </xs:element> [8] </xs:schema> 说明 [1]XML文档声明。 [2]-[6]Schema根元素声明,包含: [3] Schema命名空间的声明。 [4] 本schema定义元素归属的名称空间 [5] 必须使用前缀或设置默认命名空间显示限定所有元素 [6] 不得限定属性 [7] 正文:定义一个元素,类型为string [8]结束标记。
一个Schema可以包含多个命名空间 <xs:schema xmlns:xs=“http://www.w3.org/2001/XMLSchema” xmlns:dt=“urn:schemas-microsoft-com:datatypes” xmlns:myNS=“http://www.xml_step_by_step.edu\ns.xml”> Xmlns:xs="http://www.w3.org/2001/XMLSchema" 指明xs命名地址; 指明dt命名(数据类型)地址; xmlns:myNS=“http://www.xxx.xxx\ns.xml” 指明myNS命名(自定义的元素或属性等)地址。
Schema定义 (1)元素定义 (2)属性定义 (3)类型定义 (4)对元素或属性的限定
(1)元素定义 语法 说明 name: 可选。元素名称。如果父元素是 schema 元素,则必需。 type:可选。指定元素类型 内建数据类型(如int、string) simpleType 、 complexType maxOccurs:可选。元素可出现最大次数,大于等于零,默认为 1。 minOccurs:可选。元素可出现最小次数,大于等于零,默认为 1。 default:可选。元素默认值,仅当元素内容是简单类型或 textOnly 时使用。 fixed:可选。元素固定值,仅当元素内容是简单类型或 textOnly 时使用。 ref:可选。对另一元素的引用。 ref 属性可包含一个命名空间前缀。 如果父元素是 schema 元素,则不使用该属性。 语法 <xs:element name=“元素名称” type=“元素类型” maxOccurs=“最多出现次数” minOccurs=“最少出现次数” default=“默认值” fixed=“固定值” ref=QName> 子元素 <xs:/element>
实例 Schema文档 XML文档 <?xml version="1.0" encoding="GB2312"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://myspace.cn" xmlns="http://myspace.cn" > <xsd:element name="通信录"> <xsd:complexType> <xsd:element name="姓名" type="xsd:string"/> <xsd:element name="地址" type="xsd:string"/> </xsd:complexType> </xsd:element> </xsd:schema> XML文档 <?xml version="1.0" encoding="GB2312" ?> <通信录 xmlns="http://myspace.cn" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xsi:schemaLocation="http://myspace.cn list-2.xsd"> <姓名>张大万</姓名> <地址>北京市海淀区三里河路1号</地址> </通信录>
(2)属性定义 语法 说明 use: name、 type 、default、fixed、ref <xs:attribute name=“属性名称” type=“属性类型” use=“使用方式” default=“默认值” fixed=“固定值” ref=QName> 子元素 <xs:/attribute> 说明 name、 type 、default、fixed、ref 含义与element定义相同,但type只能是简单类型 。 use: Optionalo:不是必须的,默认属性 prohibited:禁用 required: 必备
(3)类型定义 三种类型 内嵌数据类型 简单类型(simpleType) 复杂类型( complexType) 在《XML Schema Part 2: Datatypes》中定义 http://www.w3.org/2001/XMLSchema.xsd 简单类型(simpleType) 复杂类型( complexType)
内嵌数据类型
简单类型定义:simpleType 简单类型 语法 被定义元素只包含文本内容,不包含子元素 <xs:simpleType id=“id值” name=”类型名称“ any attributes> (annotation?,(restriction|list|union)) <xs:/simpleType> id=“id值”:可选。规定该元素的唯一的 ID。 name=”类型名称“:该名称必须是在 XML 命名空间规范中定义的无冒号名称 (NCName)。 any attributes :可选。规定带有 non-schema 命名空间的任何其他属性。 ? :符号声明元素可在 simpleType 元素中出现零次或一次。
简单类型定义:simpleType 限制性定义元素:restriction 用于为 XML 元素或者属性定义可接受的值. 例如: 例1: <xs:element name="age"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxInclusive value="120"/> </xs:restriction> </xs:simpleType> </xs:element> 例1: <xs:element name="age“ type=“vage> </xs:element> <xs:simpleType name=“vage”> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxInclusive value="120"/> </xs:restriction> </xs:simpleType>
简单类型定义:simpleType 指定数据类型为简单类型列表列表:list 用空格分离。 Schema文档: XML文档: <xs:element name=“作者” type:=“authlist”/> <xs:simpleType name=“authlist”> <xs:list itemType="xs:string“/> </xs:simpleType> XML文档: <作者>张三 李四 王五</作者>
简单类型定义:simpleType 指定数据类型为多个简单类型集合:union XML文档: Schema文档: <xs:element name=“生日” type=“birthtype”/> <xs:simpleType name=“birthtype”> <xs:list memberTypes="xs:string xs:date“/> </xs:simpleType> XML文档: <生日>1986-10-10 </生日> 或者 <生日>1986年10月10日 </生日>
复合类型定义:complexType 语法: 复合类型:complexType 指被定义元素中可以包含子元素 /属性及混合内容。 <xs:complexType name=“类型名称” mixed=“是否包含字符数据”> 子元素 </xs:complexType> mixed: true:可以包含字符型数据 false:不可以包含字符型数据 子元素限定: sequence choice all simpleContent complexContent
复合类型定义:complexType sequence限定 子元素按定义顺序出现 方式一: 方式二: <xs:element name="employee"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name=“email" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> 方式二: <xs:element name="employee“ type=“emtype” /> <xs:complexType name=“emtype”> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name=“email" type="xs:string"/> </xs:sequence> </xs:complexType>
复合类型定义:complexType choice限定 从所定义的多个子元素中选择一个 <xs:element name=“籍贯“ type=“fromtype” /> <xs:complexType name=“fromtype”> <xs:choice> <xs:element name=“省" type="xs:string"/> <xs:element name=“自治区" type="xs:string"/> <xs:element name=“直辖市" type="xs:string"/> </xs:choice> </xs:complexType> XML文档: <籍贯> <省>河北 </省 </籍贯> 或者 <自治区>宁夏 </自治区> <直辖市>北京 </直辖市>
复合类型定义:complexType all限定 所有定义的子元素都出现一次,顺序无限制。 <xs:element name=“教室“ type=“courseroom” /> <xs:complexType name=“courseroom”> <xs:all> <xs:element name=“生物" type="xs:string"/> <xs:element name=“物理" type="xs:string"/> <xs:element name=“化学" type="xs:string"/> </xs:all> </xs:complexType> XML文档: <教师> <物理>S101 </物理> <生物>S103 </生物> <化学>S108 </化学> </教师>
复合类型定义:complexType 复合内容:complexContent 在复合元素类型基础上(继承)进行扩展或限定。 <xs:element name="employee" type="fullpersoninfo"/> <xs:complexType name="personinfo"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="fullpersoninfo"> <xs:complexContent> <xs:extension base="personinfo"> <xs:element name="address" type="xs:string"/> <xs:element name="city" type="xs:string"/> </xs:extension> </xs:complexContent> 对personinfo扩展,增加Address、city
(4)对元素或属性的限定 1. restriction元素 minInclusive/maxInclusive enumeration 用于对simpleType、simpleContent、complexContent等元素限定。 语法: <xs:restriction base=“QName”>子元素</ xs:restriction > minInclusive/maxInclusive <xs:element name="age"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxInclusive value="120"/> </xs:restriction> </xs:simpleType> </xs:element> enumeration <xs:simpleType name=“cartype”> <xs:restriction base="xs:string"> <xs:enumeration value="Audi"/> <xs:enumeration value="Golf"/> <xs:enumeration value="BMW"/> </xs:restriction> </xs:simpleType>
(4)对元素或属性的限定 1. restriction元素 pattern(四字母字串,2数字2字母) 语法: <xs:restriction base=“QName”>子元素</ xs:restriction > pattern(四字母字串,2数字2字母) <xs:simpleType name=“pasword”> <xs:restriction base="xs:string"> <xs:pattern value="[a-z][0-9][a-z][0-9]"/> </xs:restriction> </xs:simpleType> pattern(a-z中零或多个字母) <xs:element name="letter"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="([a-z])*"/> </xs:restriction> </xs:simpleType> </xs:element>
(4)对元素或属性的限定 1. restriction元素 pattern(8字节,大小写字母或数字) 语法: <xs:restriction base=“QName”>子元素</ xs:restriction > pattern(8字节,大小写字母或数字) <xs:simpleType name=“pasword”> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z0-9]{8}"/> </xs:restriction> </xs:simpleType> pattern(a-z中零或多个字母) <xs:element name="letter"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="([a-z])*"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:pattern value=“([a-z][A-Z][0-9])+"/> <xs:pattern value="male|female"/>
(4)对元素或属性的限定 1. restriction元素 语法: <xs:restriction base=“QName”>子元素</ xs:restriction > 对空白的限定:whiteSpace <xs:element name="address"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:whiteSpace value="preserve"/> </xs:restriction> </xs:simpleType> </xs:element> Value=: preservce: 保留空白 replace:移除所有空白字符(换行、回车、空格以及制表符)。 collapse :将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格)。
(4)对元素或属性的限定 1. restriction元素 语法: <xs:restriction base=“QName”>子元素</ xs:restriction > 对长度的限定:指定精确长度 <xs:element name="password"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="8"/> </xs:restriction> </xs:simpleType> </xs:element> 对长度的限定: <xs:element name="password"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="5"/> <xs:maxLength value="8"/> </xs:restriction> </xs:simpleType> </xs:element>
(4)对元素或属性的限定 1.restriction元素
(4)对元素或属性的限定 2.extension元素 用于扩展simpleContent、complexcontent元素 语法: <xs:extension base=“QName”>子元素</ xs:extension >
(4)对元素或属性的限定 3.any、anyAttribute元素 family.xsd 指定在XML文档中可以使用未在 schema中 规定的元素、属性。 family.xsd <xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:any minOccurs=“0”/> {person可以有任意元素} </xs:sequence> <xs:anyAttribute/> {person可以有任意属性} </xs:complexType> </xs:element>
(4)对元素或属性的限定 3.any、anyAttribute元素 children.xsd <xs:element name="children"> {自定义元素} <xs:complexType> <xs:sequence> <xs:element name="childname" type="xs:string" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element>
(4)对元素或属性的限定 3.any、anyAttribute元素 family.xml <persons xmlns="http://www.microsoft.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:SchemaLocation="http://www.microsoft.com family.xsd http://www.w3school.com.cn children.xsd"> <person> <firstname>David</firstname> <lastname>Smith</lastname> <children> <childname>mike</childname> </children> </person>
(4)对元素或属性的限定 3.any、anyAttribute元素 myfamily.xsd … <xs:attribute name=“gender”> {自定义属性} <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="male|female"/> </xs:restriction> </xs:simpleType> </xs:attribute>
(4)对元素或属性的限定 3.any、anyAttribute元素 myfamily.xml <persons xmlns="http://www.microsoft.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:SchemaLocation="http://www.microsoft.com family.xsd http://www.w3school.com.cn children.xsd"> … <person gender="female" > <firstname>David</firstname> <lastname>Smith</lastname> <children> <childname>mike</childname> </children> </person> <person gender="male" > <firstname>Jack</firstname>
(4)对元素或属性的限定 4.group元素分组 <xs:group name="custGroup"> name=”元素分组名称“ ref=“引用的元素分组名称” maxOccurs =“最大次数” minOccurs=“最小次数” > 子元素 </group> (name 和 ref 属性不能同时出现 ) <xs:group name="custGroup"> <xs:sequence> <xs:element name="customer" type="xs:string"/> <xs:element name="orderdetails" type="xs:string"/> <xs:element name="billto" type="xs:string"/> <xs:element name="shipto" type="xs:string"/> </xs:sequence> </xs:group> <xs:element name="order" type="ordertype"/> <xs:complexType name="ordertype"> <xs:group ref="custGroup"/> <xs:attribute name="status" type="xs:string"/> </xs:complexType>
(4)对元素或属性的限定 4.attributeGroup属性分组 <attributeGroup name=”属性分组名称“ ref=“引用的属性分组名称” any attributes > 子元素 </attributeGroup> (name 和 ref 属性不能同时出现 ) <xs:attributeGroup name="personattr"> <xs:attribute name="attr1" type="string"/> <xs:attribute name="attr2" type="integer"/> </xs:attributeGroup> <xs:complexType name="person"> <xs:attributeGroup ref="personattr"/> </xs:complexType>
第四节 schema Schema介绍 Schema规范 Schema应用
Schema的应用 由于XML Schema的种种优点,国际上一些知名企业和组织都提供对XML Schema的支持。 微软从其浏览器软件IE 5.0开始支持Schema。
微软Schema资源库 http://www.biztalk.org/ BizTalk是微软发布的schema库 各商家定义自己的schema,提交到bizTalk.org进行注册; 每个Schema必须遵守编写规则,而且要有一些规定好的必要元素和属性。 用户可以注册和查找schema,共享。
xml.org的Schema资源库 http://www.xml.org/ xml.org是OASIS发布的Schema资源。 通过xml.org,OASIS进行了XML应用信息的搜集、管理和发布,包括数据字典、Schema、命名空间和DTD。 企业机构和组织也可将自己制定的Schema提交到xml.org。 企业用户或开发者在xml.org查找相关Schema,在自己的系统中应用。
第二章 XML语言 第一节 XML概述 第二节 XML语法 第三节 DTD 第四节 Schema 第五节 Namespace 第六节 XSL 第八节 其他
第五节 Namespace 命名空间 命名空间是一种名称的集合,通过一种 URI 来引用标识,作为元素类型和属性的名称,它应用于 XML文档。 命名空间规范 Namespaces in XML 1.0 (Third Editoion) http://www.w3.org/TR/REC-xml-names
XML命名空间 声明命名空间 命名空间的使用
声明命名空间 命名空间规范 XML 使用 URI 作标识符指定命名空间 名域是大小写敏感的 使用 URI 的目的是保持域名的唯一性,XML 名域只将它作为字符串处理。 URI 不必是有效的,它可以不指向任何真实位置,即使计算机没有与 Internet 连接,也可以处理 XML文档。 不需要建立专门的机构来接受特定名称的申请、审核和维护,使用者也免去了申报、注册之类的繁杂事务。 名域是大小写敏感的 Student 和 student 代表不同的名域。
声明命名空间 命名空间的声明格式 命名空间引用方式: <元素 xmlns:前缀=“URI”> XML 命名空间由两部分构成: URI(Uniform Resource Identifier),它是区分名域的依据。 前缀(prefix),用以标识元素来自哪个名域,避免了直接使用冗长的 URI 或网址做元素、属性的标识,给名域的使用带来极大的便利。 命名空间引用方式: <前缀:元素>
在Schema文件中,命名空间是由xmlns属性来指定: <Schema name="mySchema" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes“ xmlns:myNS=“http://www.url.edu\ns.xml” >
以前面的“联系人列表”为例子,假定需要知道每个联系人的直接上级,DTD中要为“联系人”元素增加一个子元素“直接上级”。修改后的DTD文件源码如下: ( 联系人列表.dtd ) <!ELEMENT 联系人列表 (联系人)*> <!ELEMENT 联系人 (姓名,ID,公司,EMAIL,电话,地址,直接上级)> <!ELEMENT 地址 (街道,城市,省份)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT ID (#PCDATA)> <!ELEMENT 公司 (#PCDATA)> <!ELEMENT EMAIL (#PCDATA)> <!ELEMENT 电话 (#PCDATA)> <!ELEMENT 直接上级 ANY> <!ELEMENT 街道 (#PCDATA)> <!ELEMENT 城市 (#PCDATA)> <!ELEMENT 省份 (#PCDATA)>
“直接上级”的内容来自于另一个DTD声明—(企业经理.dtd): <!ELEMENT 企业经理 (姓名,电话)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT 电话 (秘书电话,手机)> <!ELEMENT 秘书电话 (#PCDATA)> <!ELEMENT 手机 (#PCDATA)>
没有命名空间的XML <联系人列表 xmlns="联系人列表.dtd" > <联系人> <姓名>张三</姓名> <ID>001</ID> <公司>A公司</公司> <EMAIL>zhang@aaa.com</EMAIL> <电话>(010)62345678</电话> <地址> <街道>五街1234号</街道> <城市>北京市</城市> <省份>北京</省份> </地址> <直接上级> <姓名>王五</姓名> <电话> <秘书电话>(010)62345678</秘书电话> <手机>13601234567</手机> </电话> </直接上级> </联系人> </联系人列表> 冲突
使用命名空间的XML <联系人:联系人列表 xmlns:联系人 ="联系人列表.dtd" xmlns:企业经理 ="企业经理.dtd"> <联系人:联系人> <联系人:姓名>张三</联系人:姓名> <联系人:ID>001</联系人:ID> <联系人:公司>A公司</联系人:公司> <联系人:EMAIL>zhang@aaa.com</联系人:EMAIL> <联系人:电话>(010)62345678</联系人:电话> <联系人:地址> <联系人:街道>五街1234号</联系人:街道> <联系人:城市>北京市</联系人:城市> <联系人:省份>北京</联系人:省份> </联系人:地址> <联系人:直接上级> <企业经理:姓名>王五</企业经理:姓名> <企业经理:电话> <企业经理:秘书电话>(010)62345678</企业经理:秘书电话> <企业经理:手机>13601234567</企业经理:手机> </企业经理:电话> </联系人:直接上级> </联系人:联系人> </联系人:联系人列表>
XML文件中元素的合法名称的形式是: 前缀部分:本地部分 “前缀部分”和“本地部分”都要求是一个合法XML名称。 前缀部分必须是一个已经经过声明的命名空间前缀,语法分析器将把它与命名空间声明中的URI引用相联系; 本地部分则是在DTD或Schema中定义的元素和属性名。 例如: 企业经理:姓名 dc:title
命名空间的声明方式 直接方式 <企业经理:姓名> <dc:title> 缺省方式 缺省声明的命名空间就是作用域内的缺省命名空间,因此,在这个作用域内使用该命名空间的元素、属性的合法名称无须再写前缀部分。 例如: <books xmlns="http://purl.org/dc/elements/1.1/”> <title>呐喊</title> </books>
XML命名空间 声明命名空间 命名空间的使用
命名空间作用于元素 要求 声明的位置 作用域 用于起始元素标记、结束元素标记和空元素标记。 前缀部分必须是一个已经声明过的命名空间前缀 既可以在使用该前缀的起始元素的标记处 也可以是在父元素标记处 作用域 声明所在元素范围内,包括所有子元素; 可以被新声明所覆盖。
<联系人:联系人列表 xmlns:联系人 ="联系人列表 <联系人:联系人列表 xmlns:联系人 ="联系人列表.dtd"> <联系人:联系人> <联系人:姓名>张三</联系人:姓名> <联系人:ID>001</联系人:ID> <联系人:公司>A公司</联系人:公司> <联系人:EMAIL>zhang@aaa.com</联系人:EMAIL> <联系人:电话>(010)62345678</联系人:电话> <联系人:地址> <联系人:街道>五街1234号</联系人:街道> <联系人:城市>北京市</联系人:城市> <联系人:省份>北京</联系人:省份> </联系人:地址> <联系人:直接上级 xmlns:企业经理 =“企业经理.dtd”> <企业经理:姓名>王五</企业经理:姓名> <企业经理:电话> <企业经理:秘书电话>62345678</企业经理:秘书电话> <企业经理:手机>13601234567</企业经理:手机> </企业经理:电话> </联系人:直接上级> </联系人:联系人> </联系人:联系人列表> 作用全局 作用局部
<联系人列表 xmlns="联系人列表.dtd" xmlns:企业经理 ="企业经理.dtd"> <联系人> <姓名>张三</姓名> <ID>001</ID> <公司>A公司</公司> <EMAIL>zhang@aaa.com</EMAIL> <电话>(010)62345678</电话> <地址> <街道>五街1234号</街道> <城市>北京市</城市> <省份>北京</省份> </地址> <直接上级> <企业经理:姓名>王五</企业经理:姓名> <企业经理:电话> <企业经理:秘书电话>(010)62345678</企业经理:秘书电话> <企业经理:手机>13601234567</企业经理:手机> </企业经理:电话> </直接上级> </联系人> </联系人列表> 缺省命名空间
<联系人列表 xmlns="联系人列表 <联系人列表 xmlns="联系人列表.dtd"> <联系人> <姓名>张三</姓名> <ID>001</ID> <公司>A公司</公司> <EMAIL>zhang@aaa.com</EMAIL> <电话>(010)62345678</电话> <地址> <街道>五街1234号</街道> <城市>北京市</城市> <省份>北京</省份> </地址> <直接上级> <姓名 xmlns = "">王五</姓名> <电话 xmlns = ""> <秘书电话 xmlns = "">(010)62345678</秘书电话> <手机 xmlns = "">13601234567</手机> </电话> </直接上级> </联系人> </联系人列表> 命名空间声明中URI为空串时,元素不属于任何命名空间。 这里,两个“姓名”元素不一样。
命名空间作用于属性 命名空间也可用于属性 如下: <联系人 xmlns:企业经理 = “http://www.xml.net.cn/联系人列表.dtd”> <姓名 企业经理:文种 = “中文”>李华</姓名> <电话 企业经理:城市 = “北京”>62348765</电话> </联系人>
第二章 XML语言 第一节 XML概述 第二节 XML语法 第三节 DTD 第四节 Schema 第五节 Namespace 第六节 XSL 第八节 其他
第六节 XSL 样式单(Style Sheet) XML数据与样式单被定义成不同文件 W3C推荐两种样式单标准 描述结构文档表现方式,既可以描述文档如何在屏幕上显示,也可以描述它们的打印效果,甚至声音效果。 XML数据与样式单被定义成不同文件 XML格式文档不像HTML那样复杂、繁乱,XML编写者可集中精力于数据本身,而不受显示方式的影响。 相同的数据,因为定义不同样式单可以使呈现出不同的显示外观。 W3C推荐两种样式单标准 层叠样式单CSS(Cascading Style Sheets) 可扩展样式单语言XSL(eXtensible Stylesheet Language)。
第六节 XSL CSS 可以定义HTML或XML文档中元素的显示效果,包括元素的位置、颜色、背景、边空、字体、排版格式等等。
HTML应用CSS的例子 这是红色的一号标题。 但"myclass"类中的二号标题是蓝色的。 <HTML> <HEAD> <STYLE> H1{color:red; } myclass{color:green} H2.myclass{color:blue} #myid{color:brown}</STYLE> </HEAD> <BODY> <H1>这是红色的一号标题。</H1> <P class="myclass">"myclass"类中的正文是绿色的。</P> <H2 class="myclass">但"myclass"类中的二号标题是蓝色的。</H2> <P class="myclass" id="myid">以"myid"为标识的正文则是棕色的。</P> </BODY> </HTML> 这是红色的一号标题。 "myclass"类中的正文是绿色的。 但"myclass"类中的二号标题是蓝色的。 以"myid"为标识的正文则是棕色的。
XML文档使用CSS student.xml: <?xml version="1.0" encoding="gb2312" ?> <?xml-stylesheet type="text/css" href="mystyle.css"?> <roster> <student> <name>李华</name> <origin>河北</origin> <age>15</age> <telephone>62875555</telephone> </student> <student> <name>张三</name> <origin>北京</origin> <age>14</age> <telephone>82873425</telephone> </student> </roster>
XML文档使用CSS mystyle.css: roster,student { font-size:15pt; font-weight:bold; color:blue; display:block; margin-bottom:5pt; } origin,age,telephone { font-weight:bold; font-size:12pt; display:block; margin-left:20pt; } name { font-weight:bold; font-size:14pt; display:block; color:red; margin-top:5pt; margin-left:8pt; }
第六节 XSL XSL(eXtensible Stylesheet Languge) 可扩展样式单语言,由W3C制定。 XSL通过XML进行定义,遵守XML语法规则,是XML的一种具体应用,XSL文档可以被XML解释器解析。
XSL由两大部分组成 第一部分 第二部分 根据XML文档构造源树 根据给定的XSL将这个源树转换为可以显示的结果树。 W3C推荐标准是:XSLT(XSL Transformations)。 第二部分 格式化:按照格式对象FO(Formatted Object)解释结果树,产生一个可以在屏幕上、纸上、语音设备或其它媒体中输出的结果。 W3C还未能出台一个得到多方认可的FO。
XSLT基本思想 通过定义转换模板,将XML源文档转换为带样式信息的可浏览文档。 为了支持对XML文档节点元素的操作,XSLT包含一种可扩展路径语言:XPath
XPath 功用 结点定位 简单操作 XML文档中的元素结点、属性结点、文本结点、命名空间结点、处理指令结点等
XPath:路径表达式 指定结点路径获得相关信息 <bookstore> <book> <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <title lang="eng">Learning XML</title> <price>39.95</price> </bookstore>
XPath:谓词 对结点进行过滤操作 <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <title lang="eng">Learning XML</title> <price>39.95</price> </bookstore>
XPath:定位阶 路径表达式: /step/step…… <bookstore> <book> <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <title lang="eng">Learning XML</title> <price>39.95</price> </bookstore>
XPath测试 路径表达式: xmlDoc.selectNodes("/bookstore/book") <bookstore> <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <title lang="eng">Learning XML</title> <price>39.95</price> </bookstore> 路径表达式: set xmlDoc=CreateObject("Microsoft.XMLDOM") xmlDoc.selectNodes("/bookstore/book") 测试结果: <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <title lang="eng">Learning XML</title> <price>39.95</price>
XPath测试 路径表达式: <bookstore> <book> <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <title lang="eng">Learning XML</title> <price>39.95</price> </bookstore> 路径表达式: set xmlDoc=CreateObject("Microsoft.XMLDOM") xmlDoc.selectNodes("/bookstore/book[1]") 测试结果: <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book>
XPath测试 路径表达式: <bookstore> <book> <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <title lang="eng">Learning XML</title> <price>39.95</price> </bookstore> 路径表达式: set xmlDoc=CreateObject("Microsoft.XMLDOM") xmlDoc.selectNodes(“/bookstore/book/price/text()") 测试结果: 29.99 39.95
XPath测试 路径表达式: <bookstore> <book> <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang=“fra">Harry Potter</title> <price>29.99</price> </book> <title lang="eng">Learning XML</title> <price>39.95</price> </bookstore> 路径表达式: set xmlDoc=CreateObject("Microsoft.XMLDOM") xmlDoc.selectNodes("//title[@lang='eng']") 测试结果: <title lang="eng">Learning XML</title>
XSLT应用场景 XML文档 HTML文档 XSLT 转换器 XSLT文档
XSLT结构 <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" > <xsl:template> <xsl:apply-templates/> </xsl:template> <xsl:template match=“XPath表达式”> 模板内容 …… </xsl:stylesheet》
XSLT模板 模板定义 模板实例 <xsl:template match=“XPath表达式” name=“模板名称”> 模板内容 </xsl:template> <xsl:template match=“//book[1]”> <table border=“1”> <tr> <td> <B>书名</B> </td> <td> <B>价格</B> </td> </tr> <tr> <td><xsl:value-of select=“title"/></td> <td><xsl:value-of select=“price"/></td> </tr> </table> </xsl:template>
XSLT模板引用(一) <xsl:apply-templates>应用形式一 <xsl:template match=“/”> <xsl:apply-templates /> </xsl:template> 表示对当前节点(根节点)的所有子节点应用模板。 <xsl:apply-templates>应用形式二 <xsl:template match=“student”> <xsl:apply-templates select=“Name” /> 表示模板只应用于“student”节点下的“Name”子节点。
XSLT模板引用(一) <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" > <xsl:template match=“/”> <xsl:apply-templates select=“book[1]”/> </xsl:template> <xsl:template match=“book[1]”> <TABLE BORDER=“1”> <THEAD> <TD> <B>书名</B> </TD> <TD> <B>价格</B> </TD> </THEAD> <TR> <TD><xsl:value-of select=“title"/></TD> <TD><xsl:value-of select=“price"/></TD> </TR> </TABLE> </xsl:template> </xsl:stylesheet》
XSLT模板引用(二) <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" > <xsl:template match=“/”> <xsl:call-templates name=“list”/> </xsl:template> <xsl:template match=“/” name=“list”> <TABLE BORDER=“1”> <THEAD> <TD> <B>书名</B> </TD> <TD> <B>价格</B> </TD> </THEAD> <TR> <TD><xsl:value-of select=“/bookstore/book[1]/title"/></TD> <TD><xsl:value-of select=“/bookstore/book[1]/ price"/></TD> </TR> </TABLE> </xsl:template> </xsl:stylesheet》
XSLT操作指令 xsl:value-of 功能:提取指定结点的值 语法:<xsl:value-of select=“XPath表达式”/> 实例: <xsl:value-of select=“//title”/> 输出title元素的值。 <xsl:value-of select=“//title/@lang”/> 输出title元素的属性lang的值。
XSLT操作指令 xsl:for-each 实例: 功能:多结点的循环处理指令 语法: <xsl:for-each select=“XPath表达式” order-by=“子结点名称” > 子元素 </xsl:for-each> 实例: <xsl:for-each select=“book" order-by=“title"> <TR> <TD><xsl:value-of select=“title"/></TD> <TD><xsl:value-of select=“price"/></TD> </TR> </xsl:for-each>
XSLT操作指令 xsl:if 实例: <xsl:template match=“book”> 功能:条件判断 语法: <xsl:if test=“条件表达式”> 子元素 </xsl:if> 实例: <xsl:template match=“book”> <xsl:for-each select=“title”> <xsl:if test=“@lang=‘eng’”> 本书为英文书,名称为<xsl:value-of select=“title"/> </xsl:if> </xsl:for-each> </xsl:template>
XSLT操作指令 xsl:choose 功能:多条件判断 语法: <xsl:choose> <xsl:when test=“条件表达式1” …… </xsl:when> <xsl:when test=“条件表达式2” <xsl:otherwise” </xsl:otherwise> </xsl:choose>
XSLT应用实例 国家科学图书馆SRU检索平台 (SRU, Search and Retrieval via URL) NSL 联合目录库 Stylesheet NSL 联合目录库 浏览器 XML Response NSL SRU Server HTML NSL 学位论文库 URL Request 国防 科技信息库
XSLT应用实例 国家科学图书馆SRU检索平台 (SRU, Search and Retrieval via URL) 检索URL 检索结果 http://sru.csdl.ac.cn/SRW/services/DEIS?query=dc.title+%3D+%22system%22&version=1.1&operation=searchRetrieve&recordSchema=info%3Asrw%2Fschema%2F1%2Fdc-v1.1&maximumRecords=10&startRecord=1&resultSetTTL=300&recordPacking=xml&recordXPath=&sortKeys=&stylesheet=/SRW/dbase/DEIS/searchRetrieveResponse.xsl 检索结果 没有指定XSL的XML DEMO 指定了XSL的XML—客户端转换
XSLT转换实现 客户端转换 以上国科图SRU例子 服务器端转换 服务器 浏览器 在服务前端完成:XML + XSL -> HTML 转换,然后再将HTML文件送往客户端进行浏览。 优点是兼容任何浏览器,缺点是要管理转换过程。 查看 服务器 XML+XSL HTML 浏览器
第七节 XML的应用 Web标准描述成为XML主要应用形式 面向网页的应用: XHTML 面向科技领域的应用:MathML 面向图形图象的应用:SVG 面向多媒体的应用:SMIL 面向无线网的应用:HDML和WML 面向电子商务的应用 面向电子政务的应用 面向e-publishing的应用 面向e-learning的应用 面向Web服务集成的应用
面向网页的应用 XHTML XHTML是将HTML改用XML来重新定义,是HTML到XML的过渡版本。 XHTML必须遵守XML的规范,严格执行,不再像过去那么随便。
面向科技领域的应用:MathML MathML的目标是用XML描述数学公式 W3C于1998年发布了MathML的1.0版本,现在MathML2.0草案也在讨论之中。 例如,要描述下列公式
XML描述如下 <mrow> <mi>x</mi> <mo>=</mo> <mfrac> <mrow> <mrow> <mo>-</mo> <mi>b</mi> </mrow> <mo>±</mo> <msqrt> <mrow> <msup> <mi>b</mi> <mn>2</mn> </msup> <mo>-</mo> <mrow> <mn>4</mn> <mo>⁢</mo> <mi>a</mi> <mo>⁢</mo> <mi>c</mi> </mrow> </mrow> </msqrt> </mrow> <mrow> <mn>2</mn> <mo>⁢</mo> <mi>a</mi> </mfrac>
面向图形图象的应用 SVG (Scalable Vector Graphics) W3C于1999年发布了第一个讨论草案,后几经修订发布了最终草案。 SVG是一种基于XML的用来描述二维矢量图形和矢量/点阵混合图形的置标语言,其全称是可扩展矢量图形规范。
面向多媒体的应用 SMIL:同步多媒体合成语言,即Synchronized Multimedia Integration Language。 描述多媒体对象,以便将视频、音频、图象、文字在时间和空间轴上集成为一个同步多媒体演示文档。 SMIL包含了以下三方面的内容: 描述演示文档的屏幕布局 描述演示文档的时间行为 描述媒体对象间的相关链接
面向无线网的应用 HDML:Handheld Device Markup Language Specification 为小显示屏的手持设备定义类似超文本内容和应用的语言 HDML的重点是内容的表现与布局,为手机、呼机、无线PDA等手持设备提供服务。 WML :Wireless Markup Language WML是WAP论坛制定的一个基于XML的移动通信设备的置标语言,它定义了在较窄的显示设备上进行Web浏览的内容及用户界面,包括使用手机上网。
面向电子商务的应用 基于XML的电子商务标准分为三类: 体系结构相关的标准: 供应链各环节功能相关标准: ebCPP( ebXML Collaborative Partner Profile Agreement ) ebMS( ebXML Messaging Service Specification ) ebRIM( ebXML Registry Information Model ) ebRS( ebXML Registry Services Specification) 供应链各环节功能相关标准: xCBL(XML Common Business Library):电子商务交换标准 tpaML(Trading partner agreement Markup Language ):电子合同 cXML(Commerce XML ):在线交换数据格式 WIDL (Web Interface Definition Language):定义Web接口
面向电子政务的应用 系统架构标准 文档格式标准 FEA(Federal Enterprise Architecture):美国联邦政府组织架构 e-GIF(e-Government Interoperability Framework):英国政府电子政务互操作框架 SAGA(Standards and Architectures for E-Government Applications):德国政府电子政务应用标准与架构 文档格式标准 ODF(Open Document Format)ISO/IEC 26300:2006 :国际标准 UOF(Unified Office Document format):中文办公文档格式 OOXML(Office Open XML):微软办公文档格式
面向e-publishing的应用 国际数字出版论坛IDPF三个开放标准: Open Publication Structure (OPS) 前身是1999年颁布的OEB( Open eBook Structure Specification 1.0):统一文档数据格式标准。 Open Packaging Format (OPF) 统一封装格式 Open Container Format (OCF) 开放容器格式
面向e-learning的应用 ADL(Advanced Distributed Learning Initiative ) SCORM(Sharable Content Object Reference Model):学习对象定义、访问、重用、互操作标准。 Sakai IMS (IMS Global Learning Consortium ) IMS Content Packaging: 内容封装规范 IMS Simple Sequencing:内容序列规范 IEEE Data Model for Content to Learning Management System Communication:数据模型 ECMAScript application programming interface for content to runtime services communication:界面交互规范 LOM(Learning Object Metadata):学习对象元数据规范 Markup Language (XML) Schema Definition Language Binding for Learning Object Metadata:学习对象schema
面向Web服务集成的应用 应用举例 服务描述标准 资源描述框架 概念描述语言 消息交换标准 内容聚合标准 WSDL(Web Services Description Language ) 资源描述框架 RDF(Resource Description Framework ) 概念描述语言 OWL(Web Ontology Language ) 消息交换标准 SOAP(Simple Object Access Protocol) 内容聚合标准 RSS(Really Simple Syndication)
第八节 其他 XML编程之:DOM4J the starting guide
第八节 其他 JSON (JavaScript Object Notation) JSON 是一种轻量级的计算机数据交换语言。 优点: 解析性能高; 支持多种语言, 包括Actionscript、ColdFusion、Java、Javascrīpt、Perl、PHP、Python、Ruby等; 代码开发量小,可维护性强。
第八节 其他 JSON 与XML比较 <?xml version=”1.0” encoding=”UTF-8”?> <Image> <Width>800</Width> <Height>600</Height> <Title>View from 15th Floor</Title> <Thumbnail> <Url>http://scd.mm-b1.yimg.com /image/481989943</Url> <Height>125</Height> <Width>100</Width> </ Thumbnail> <IDs> <ID>116</ID> <ID 943<ID> <ID>234</ID> <ID>38793</ID> </IDs> </Image> { "Image": "Width":800, "Height":600, "Title": "View from 15th Floor", "Thumbnail": "Url":"http://scd.mm-b1.yimg.com /image/481989943", "Height": 125, "Width": "100" }, "IDs": [ 116, 943, 234, 38793 ] }
第八节 其他 JSON 编程举例 Demo1 静态页面 Demo2 AJAX+JSON
第八节 其他 发展前景 随着Web2.0发展,JSON将有越来越多的应用,如: Rich UI Mashup AJAX+JSON成为新的用户界面开发模式 Mashup Google、Amazon、Flickr等都提供JSON API
作业 三选一: 1.选择一个XML编辑工具,用它编辑生成以下课表信息文档: (1)定义一个DTD或Schema; (2)根据上边定义的DTD或Schema ,创建一个XML文档; (3)根据自行设计的显示风格编写一个XSL; (4)最后,写出实验报告,要包含: a)所选择xml工具介绍; b)DTD(XSD)、XML、XSL三个文件内容及显示效果截图; c)总结实验中遇到的问题,并进行评价。 2.利用DOM4J 等工具做XML编程实验,测试XML文档读取/写入、或转换(xml->html)等功能。提交实验报告,包括编程平台介绍、环境配置过程、程序代码、相关的XML/XSL/HTML等文件,对实验进行评价、分析。 3.在Tomcat等环境下,做一个Web应用试验,实现后台JSON包数据封装、浏览器JSON数据解析以及用户界面控制等功能。提交实验报告,包括应用环境配置过程、JSON数据结构、程序代码html/jsp等文件,对实验进行评价、分析。 选择2或3的同学,可参照以下资料: http://crossdomain.las.ac.cn/licw/wis/xml.zip
推荐参考书 《XML实用教程》 范立锋主编 人民邮电出版社,北京,2009 ISBN:978-7-115-20527-8 198页 24.00元 本书内容主要包括:XML概述、XML文件规则、XML数据底层结构、XML Schema模式、使用CSS格式化显示XML文件、使用XSL格式化显示XML文件、XML数据源对象等. 同时还介绍两个XML解析器:DOM、SAX。