第七篇高级应用 第七篇高级应用 第一章XML及其应用 XML是标准扩展语言的简称,是未来web编程的标准。在这一章中,我们将讲述XML 在 ASPNET中的应用 711制作广告条 在这个程序中,我们通过XML语言实现每次访问网页时,将显示不同的广告条。在本 例中,我们只调用了两条广告 源文件: advanceapp intro.aspx Intro.aspx的代码如下 广告条演示 asp: adrotator AdvertisementFile="intro. xml" Border Color="black" Border Width=l runat="server"p> body> ntro.xm的代码如下: /hpl. gif http://www.yeskycom 欢迎访问! Computers80
第七篇 高级应用 第七篇 高级应用 第一章 XML 及其应用 XML 是标准扩展语言的简称,是未来 Web 编程的标准。在这一章中,我们将讲述 XML 在 ASP.NET 中的应用 7.1.1 制作广告条 在这个程序中,我们通过 XML 语言实现每次访问网页时,将显示不同的广告条。在本 例中,我们只调用了两条广告 源文件:advanceapp\intro.aspx Intro.aspx 的代码如下: 广告条演示 广告条演示 intro.xml 的 代码如下: ./hp1.gif http://www.yesky.com 欢迎访问! Computers 80
第七篇高级应用 /hp2. gif http://www.yesky.com 80 在 Intro. aspx中,我们使用了这条语句来嵌入 intro. xm文件。运行效果如图: 广眚条演示- MicrosoftInternetExplorer 区 件①)编辑C)查看①)收藏)工具〔)帮助Q 翩瘀碳翻 广告条演示 火速参加“傲群”磁带机 活动 本地 Intranet 当我们点刷新按狃或者按F5键,我们将看到另一条广告条。 广告条演示- Mi crosoft Internet Exp1orsr 口 件①)编辑)查看Q收藏)工具〔)帮助Q 广告条演示 邕本地 Intranet 在本例中,我们用到了 Ad Rotator服务器控件,在xm文件中,我们我们可以定义其属 性:如表所示
第七篇 高级应用 ./hp2.gif http://www.yesky.com 欢迎访问 Computers 80 在 intro.aspx 中,我们使用了这条语句来嵌入 intro.xml 文件。运行效果如图: 当我们点刷新按狃或者按 F5 键,我们将看到另一条广告条。 在本例中,我们用到了 AdRotator 服务器控件,在 xml 文件中,我们我们可以定义其属 性:如表所示:
第七篇高级应用 图象文件的绝对或相对地址 NavigateUrl 当图象被点击时,可访问相应的网 当鼠标移动到图片上时,将显示提示信息 eyword 指定广告条的分类,我们可以利用此属性来 付广告条进行分类 指定图片在表格中的大小 712XML和 dataset控件结合使用 数据访问是一个应用系统的核心。公用语言运行环境( Common language runtime)提 供了管理数据访问应用程序接口(API)的方法。而这些AP将不论它的的数据源是什么, 如 SQL Server, OLEDE,XML等,都能提取出我们所需要的数据。我们在具体编程的时候, 有3个对象将常常用到: Connections,. Commands, and DataSets 对象 描述 Connection 与数据源进行连接。如 SQL Server或者一个 XML文件 对数据进行操纵。如进行删除( delete),提 取( select),更新( update) 显示出所需的数据 为了使我们能使用SQL语句,我们要先导入 System.Data和 System. Data. SQL这两个名 字空间。 语句如下 下面的表格是对几个典型的SQL语句的说明: SQL语句 Select(对单个表的操作)| SELECT* from Student Where stuname=小李 Select(对多个表的操作)| SELECT* from Student s, Dept D WhERE Sdept= D dept; Insert INSERT into Student VALUES(小王,21,·男) Delete DELETE from Student Where name=小王 Update UPDATE Student Set age=21 WHERE name=小李
第七篇 高级应用 属性 描述 ImageUrl 图象文件的绝对或相对地址 NavigateUrl 当图象被点击时,可访问相应的网页 AlternateText 当鼠标移动到图片上时,将显示提示信息 Keyword 指定广告条的分类,我们可以利用此属性来 对广告条进行分类 Impressions 指定图片在表格中的大小 7.1.2 XML 和 dataset 控件结合使用 数据访问是一个应用系统的核心。公用语言运行环境(Common Language Runtime)提 供了管理数据访问应用程序接口(API)的方法。而这些 API 将不论它的的数据源是什么, 如 SQL Server, OLEDB, XML 等,都能提取出我们所需要的数据。我们在具体编程的时候, 有 3 个对象将常常用到:Connections, Commands, and DataSets。 对象 描述 Connection 与数据源进行连接。如 SQL Server 或者一个 XML 文件。 Command 对数据进行操纵。如进行删除(delete),提 取(select),更新(update) Dataset 显示出所需的数据 为了使我们能使用 SQL 语句,我们要先导入 System.Data 和 System.Data.SQL 这两个名 字空间。 语句如下: 下面的表格是对几个典型的 SQL 语句的说明: SQL 语句 示例 Select(对单个表的操作) SELECT * from Student WHERE stuname = ‘小李’; Select(对多个表的操作) SELECT * from Student S, Dept D WHERE S.dept= D.dept; Insert INSERT into Student VALUES ('小王',21,’男’); Delete DELETE from Student WHERE name=’小王’ ; Update UPDATE Student SET age = 21 WHERE name=’小李’;
第七篇高级应用 在执行查询之前,我们要先构件一个 SQLDataSet Command对象,在执行查询以后,我 们需要把数据转移到 DataSet中,我们可以使用下面的代码: 我们假设有一个test数据库,在这个数据库中有一个 student表 Dim my Connection As New SQLConnection("server=localhost; uid=sa pwd= database=test") Dim my Command As New SQLDataSet Command("select from student", my Connection Dim ds As New Data SetO my Command. FillDataSet(ds, "student") 可能读者不禁要问:为什么要用XML文件存储数据吗?为什么不使用数据库? 这是因为:对很多目的用途来说,用数据库太过浪费了。要使用一个数据库,你必须 安装和支持一个分离的服务器处理进程( a separate server process),它常要求有安装和支持 它的管理员( administrator)。你必须学习SQL语句,并用SQL语句写查询,然后转换数据, 再返回。而如果你用XML文件存储数据,将可减少额外的服务器的负荷。还有,你还找到 了一个编辑数据的简单方法。你只要使用文本编辑器而不必使用复杂的数据库工具。XML 文件很容易备份,和朋友共享,或下载到你的客户端。同样的,你可以方便地通过p上载 新的数据到你的站点 XML还有一个更抽象的优点,即作为层次型的格式比关系型的更好。它可以用一种 很直接的方式来设计数据结构来符合你的需要。你不需要使用一个实体关系编辑器,也不 需要使你的图表( schema)标准化。如果你有一个元素( element)包含了另一个元素,你 可以直接在格式中表示它,而不需要使用表的关联 注意,在很多应用中,依靠文件系统是不够充分的。如果更新很多,文件系统会因为同 时写入而受到破坏。数据库则通常支持事务处理,可以应付所发生的请求而不至于损坏。对 于复杂的查询统计要有反复、及时的更新,此时数据库表现都很优秀。当然,关系型数据库 还有很多优点,包括丰富的查询语言,图表化工具,可伸缩性,存取控制等等。 在下面这样的案例中,正如大多数中小规模的、基于发布信息的站点一样,你可能涉及 的大多数数据存取都是读,而不是写,数据虽然可能很大,但相对来说并没有经常的更新变 化,你也不需要做很复杂的查询,即使你需要做,也将用一个独立的查询工具,那么成熟的 rdbms的优点消失了,而面向对象型的数据模型的优点则可以得到体现。 最后,为你的数据库提供一个查询器外壳来进行SQL查询并将他们转化进入 xml stream 也是完全有可能的。 所以你可以选择这二种方式之一。XML正变成一种非常健壮的,便于编程的工具,作 为某个成熟的数据库的前端工具来进行存储和查询。( oracle的 xsql servlet即是这种技术的 个很好的例子。) 713XML语法 现在我们来介绍一下 XML Schemas: 随着 XML Schema规范的逐渐普及,它成为W3C推荐标准的那一天已经不远了。我们 来看一下这个新的定义文档类型的方法 、定义元素 文档类型定义的工作现在大都是由DTDs来完成的,现在的DTD在功能上有一些限制 随着ⅹML应用的越来越广泛,这些限制逐渐阻碍了XML的发展
第七篇 高级应用 在执行查询之前,我们要先构件一个 SQLDataSetCommand 对象,在执行查询以后,我 们需要把数据转移到 DataSet 中,我们可以使用下面的代码: 我们假设有一个 test 数据库,在这个数据库中有一个 student 表。 Dim myConnection As New SQLConnection("server=localhost;uid=sa;pwd=;database=test") Dim myCommand As New SQLDataSetCommand("select * from student", myConnection) Dim ds As New DataSet() myCommand.FillDataSet(ds, "student") 可能读者不禁要问:为什么要用 XML 文件存储数据吗?为什么不使用数据库? 这是因为:对很多目的用途来说,用数据库太过浪费了。.要使用一个数据库,你必须 安装和支持一个分离的服务器处理进程(a separate server process),它常要求有安装和支持 它的管理员(administrator)。你必须学习 SQL 语句, 并用 SQL 语句写查询,然后转换数据, 再返回。而如果你用 XML 文件存储数据,将可减少额外的服务器的负荷。还有,你还找到 了一个编辑数据的简单方法。你只要使用文本编辑器,而不必使用复杂的数据库工具。XML 文件很容易备份,和朋友共享,或下载到你的客户端。同样的,你可以方便地通过 ftp 上载 新的数据到你的站点。 XML 还有一个更抽象的优点,即作为层次型的格式比关系型的更好。 它可以用一种 很直接的方式来设计数据结构来符合你的需要。你不需要使用一个实体-关系编辑器,也不 需要使你的图表(schema)标准化。 如果你有一个元素(element)包含了另一个元素,你 可以直接在格式中表示它,而不需要使用表的关联。 注意,在很多应用中,依靠文件系统是不够充分的。如果更新很多,文件系统会因为同 时写入而受到破坏。数据库则通常支持事务处理,可以应付所发生的请求而不至于损坏。对 于复杂的查询统计要有反复、及时的更新,此时数据库表现都很优秀。当然,关系型数据库 还有很多优点,包括丰富的查询语言,图表化工具,可伸缩性,存取控制等等。 在下面这样的案例中,正如大多数中小规模的、基于发布信息的站点一样,你可能涉及 的大多数数据存取都是读,而不是写,数据虽然可能很大,但相对来说并没有经常的更新变 化,你也不需要做很复杂的查询,即使你需要做,也将用一个独立的查询工具,那么成熟的 rdbms 的优点消失了,而面向对象型的数据模型的优点则可以得到体现。 最后,为你的数据库提供一个查询器外壳来进行 SQL 查询并将他们转化进入 xml stream 也是完全有可能的。 所以你可以选择这二种方式之一。XML 正变成一种非常健壮的,便于编程的工具,作 为某个成熟的数据库的前端工具来进行存储和查询。(oracle 的 xsql servlet 即是这种技术的 一个很好的例子。) 7.1.3 XML 语法 现在我们来介绍一下 XML Schemas: 随着 XML Schema 规范的逐渐普及,它成为 W3C 推荐标准的那一天已经不远了。我们 来看一下这个新的定义文档类型的方法。 一、定义元素 文档类型定义的工作现在大都是由DTDs来完成的,现在的DTD在功能上有一些限制, 随着 XML 应用的越来越广泛,这些限制逐渐阻碍了 XML 的发展
第七篇高级应用 DTD的语法不同于XML的语法,因而需要文档编写者另外的学习一套符号语言。而软件也 需要另外的一个解析器来对DTD文件进行解析 在DID中没有办法来定义能够从程序语言变量直接映射到ⅩML数据的数据类型和数 据格式。没有一组被人所熟知的基本的元素以供文档编写者选择。DTDs是ⅩML从其前辈 SGML那儿继承过来的(事实上,XML本身就是一种SGML的简化版本),这个相对比较 成熟的技术能够很快的让XML运行起来,并且能够让熟悉SGML的人对XML有更多的感 觉。然而,很快的人们就发现,XML需要一种更具表达能力的解决方案,而不仅仅是DTD。 定义元素需要指定元素的名称、元素的内容模式、元素的属性、以及内嵌的子元素 在 XML Schemas中,元素的内容模式是通过类型来定义的。一个服从于某个特定的 schema 的ⅹML文档只能按照 schema中定义的元素模式来编写,这同DTD的规则是一样的。元素 可以是简单类型的,也可以使复杂类型的。在 Schemas规范中定义了很多的简单类型,例 如: string, Integer和 decimal s简单类型的元素不能在包含子元素和属性,而复杂类型的 元素则能够嵌套子元素,并能够包含有属性。 我们来看看一个简单的定义元素的例子: element name="quantity"type="positive-integer"7> 我们知道在面向对象的观点中,有聚集和继承的概念,可以在已有的类中衍生出新类。 在这儿 Schema借用了这些观点,用户也可以通过聚集和继承来在老元素的基础上定义新的 元素。聚集能够把一组已存在的元素组合成一个新的元素。继承则通过扩展已存在的元素来 定义一个新的元素,并且这个新的元素能够代表被继承的那个元素 比如,如果我们要从 decimal类型中派生一个新的 value元素,并让它有这样的内容模 式:42,我们可以这样的定义: 下面我们把time和vaue元素聚集到一个 measurement元素中,形成这样的内容模式: 2000-10-0812:00:00GMr42 那么最终我们的 schema元素定义结果就应该是这样的: Element name=&single, measurement&single, type=&single, measurement&single; / 和上面的 schema等同DTD是:
第七篇 高级应用 DTD 的语法不同于 XML 的语法,因而需要文档编写者另外的学习一套符号语言。而软件也 需要另外的一个解析器来对 DTD 文件进行解析。 在 DTD 中没有办法来定义能够从程序语言变量直接映射到 XML 数据的数据类型和数 据格式。 没有一组被人所熟知的基本的元素以供文档编写者选择。DTDs 是 XML 从其前辈 SGML 那儿继承过来的(事实上,XML 本身就是一种 SGML 的简化版本),这个相对比较 成熟的技术能够很快的让 XML 运行起来,并且能够让熟悉 SGML 的人对 XML 有更多的感 觉。然而,很快的人们就发现,XML 需要一种更具表达能力的解决方案,而不仅仅是 DTD。 定义元素需要指定元素的名称、元素的内容模式、元素的属性、以及内嵌的子元素。 在 XML Schemas 中,元素的内容模式是通过类型来定义的。一个服从于某个特定的 schema 的 XML 文档只能按照 schema 中定义的元素模式来编写,这同 DTD 的规则是一样的。元素 可以是简单类型的,也可以使复杂类型的。在 Schemas 规范中定义了很多的简单类型,例 如: string,integer 和 decimal。简单类型的元素不能在包含子元素和属性,而复杂类型的 元素则能够嵌套子元素,并能够包含有属性。 我们来看看一个简单的定义元素的例子: 我们知道在面向对象的观点中,有聚集和继承的概念,可以在已有的类中衍生出新类。 在这儿 Schema 借用了这些观点,用户也可以通过聚集和继承来在老元素的基础上定义新的 元素。聚集能够把一组已存在的元素组合成一个新的元素。继承则通过扩展已存在的元素来 定义一个新的元素,并且这个新的元素能够代表被继承的那个元素。 比如,如果我们要从 decimal 类型中派生一个新的 value 元素,并让它有这样的内容模 式:42,我们可以这样的定义: 下面我们把 time 和 value 元素聚集到一个 measurement 元素中,形成这样的内容模式: 2000-10-08 12:00:00 GMT 42 那么最终我们的 schema 元素定义结果就应该是这样的: 和上面的 schema 等同 DTD 是:
第七篇高级应用 显然,它所能表达的意思就少了很多 从Java等面向对象语言中引入的继承的特性,还包括了可以定义抽象元素来迫使实现 子类元素,或者定义一个终结元素来禁止元素再被其它元素所继承。这使得从元素到Java 或者C++语言的类的一一映射变得更为直观可行。 二、基数表达 ML Schema比起DTD来能够更方便的表达元素基数的概念。所谓基数是指一个元素 在文档中出现的次数。在DTD中,使用的是正则表达式来表示基数的,而正则表达式的表 达能力在所有的形式化文法中是最低的,这使得你在定义文档的时候会遇到很多的困难。你 只能够指定一次(1),零次或者更多(*),一次或者更多(+)这三种基数,并用这些基数序 列来构成DTD。 XML Schema中则是使用 minOccurs和 maxoccurs这两个属性来定义元素 基数,分别用来指定元素出现的最少次数和最多次数 min Occurs和 maxOccurs的缺省值都是1,也就是说,当没有指定这两个属性的时候, 元素只允许在文档中出现一次。除了这两个属性,你还可以用 choice和a这两个元素。元 素 choice只允许它的所有子元素中的一个出现在文档中。而元素all则最为宽松,能够让其 所有的子元素在文档中以任意的顺序出现任意的次数。而这些概念在DTD中都是难以表达 的 > 三、名域 XML Schema中还支持名域。一个 Schema除了可以定义XML文档词汇表外,还可以 通过名域来定义目标名域,和其它可能会使用到的词汇名域。例如
第七篇 高级应用 显然,它所能表达的意思就少了很多。 从 Java 等面向对象语言中引入的继承的特性,还包括了可以定义抽象元素来迫使实现 子类元素,或者定义一个终结元素来禁止元素再被其它元素所继承。这使得从元素到 Java 或者 C++语言的类的一一映射变得更为直观可行。 二、基数表达 XML Schema 比起 DTD 来能够更方便的表达元素基数的概念。所谓基数是指一个元素 在文档中出现的次数。在 DTD 中,使用的是正则表达式来表示基数的,而正则表达式的表 达能力在所有的形式化文法中是最低的,这使得你在定义文档的时候会遇到很多的困难。你 只能够指定一次(1),零次或者更多 (*),一次或者更多 (+) 这三种基数,并用这些基数序 列来构成 DTD。XML Schema 中则是使用 minOccurs 和 maxOccurs 这两个属性来定义元素 基数,分别用来指定元素出现的最少次数和最多次数: minOccurs 和 maxOccurs 的缺省值都是 1,也就是说,当没有指定这两个属性的时候, 元素只允许在文档中出现一次。除了这两个属性,你还可以用 choice 和 all 这两个元素。元 素 choice 只允许它的所有子元素中的一个出现在文档中。而元素 all 则最为宽松,能够让其 所有的子元素在文档中以任意的顺序出现任意的次数。而这些概念在 DTD 中都是难以表达 的。 三、名域 XML Schema 中还支持名域。一个 Schema 除了可以定义 XML 文档词汇表外,还可以 通过名域来定义目标名域,和其它可能会使用到的词汇名域。例如:
第七篇高级应用 XML演示 Sub Page Load(Src As Object, E As EventArgs Dim ds as new dataSet Dim fs as filestream Dim Reader as stream Reader FS=New FileStream(Server. Map Path("datal. xml"), FileMode Open, FileAccess. Read DS. Read Xml(Reader) Dir Source=new Data View(ds. Tables(O)) My Span. Inner Html= Source Table TableName My Data Grid Data Source= Source My Data Grid. DataBindo End Sub
第七篇 高级应用 这种机制为建立复杂的名域体系提供了一种模块化而又易于扩展的方法。使得名域的作 用能够真正的被体现出来。 XML Schema 提供了一个丰富而更具弹性的机制来定义 XML 文档词汇表。它使用 XML 语言本身来定义关于一个 XML 文档的元信息(meta-information),这使得 XML 的协同工作 能力大大的增强了。而许多对于 DTD 功能上的改进和增强,也使得它最终必定会终结 DTD, 作为 XML 的一个标准出现。在 Apache Project 和 IBM alphaworks 的主页上现在已经有很多 的 Schema 的工具出现了,你如果有兴趣的话,不妨去看看。 好了,有上面的介绍,我们来看如何从 xml 文件中读取数据。DataSet 控件提供了 ReadXml 方法。同时在 XML 文件中,必须存在 schema 和我们所需要的数据(Data)。 好了,有了上面的介绍,我们先看一下 data1.aspx 文件: 源文件:advanceapp\data1.aspx XML 演示 Sub Page_Load(Src As Object, E As EventArgs) Dim DS As New DataSet Dim FS As FileStream Dim Reader As StreamReader FS = New FileStream(Server.MapPath("data1.xml"),FileMode.Open,FileAccess.Read) Reader = New StreamReader(FS) DS.ReadXml(Reader) FS.Close() Dim Source As DataView Source = new DataView(ds.Tables(0)) MySpan.InnerHtml = Source.Table.TableName MyDataGrid.DataSource = Source MyDataGrid.DataBind() End Sub
第七篇高级应用 XML iaz ASP: Data Grid id="My Data Grid"runat="server"/> html 我们再来看看xm文件( advanceappldatal aspx)的内容: datal xml的文件如下 id=DocumentElement xmins="hTtp://www.w3.org/1999/xmlschema xmIns xdo="urn schemas-microsoft-com xml-xdoxdo DataSet Names"DocumentElement"> jimmy boy freshman freshman
第七篇 高级应用 XML 演示 我们再来看看 xml 文件(advanceapp\data1.aspx)的内容: data1.xml 的文件如下: jimmy 20 boy freshman Mary 20 girl sophomore Tom 19 boy freshman
程序运行后演示如下: 件)编辑)查看收藏〔)工具①)帮助⑩ XML演示 student sophomore Tom 19 boy freshman Busan 20 girl freshman 包完成 也 Intranet 当然我们也可以把 schema和数据分开成对立的文件。在主文件中,我们要分别使用 eadXmlData和 Read XmISchema方法。 读取 schema xml的内容 New File Stream(Server. Map Path("schema. xml"), FileMode Open, FileAccess. Read) Schema=new Stream Reader(fS) 读取 data. xml的内容 FS=New FileStream(Server. Map Path("data. xml"), FileMode. Open, FileAccess Read) Reader= New Stream Reader(FS) DS. ReadXmlData( Reader) FS. Close 我们上面提到的data1xml分成两部分:
第七篇 高级应用 Susan 20 girl freshman 程序运行后演示如下: 当然我们也可以把 schema 和数据分开成对立的文件。在主文件中,我们要分别使用 the ReadXmlData 和 ReadXmlSchema 方法。 如: 读取 schema.xml 的内容: FS = New FileStream(Server.MapPath("schema.xml"),FileMode.Open,FileAccess.Read) Schema = new StreamReader(FS) DS.ReadXmlSchema(Schema) FS.Close() 读取 data.xml 的内容: FS = New FileStream(Server.MapPath("data.xml"),FileMode.Open,FileAccess.Read) Reader = New StreamReader(FS) DS.ReadXmlData(Reader) FS.Close() 我们上面提到的 data1.xml 分成两部分:
第一部分:生成 schema xml文件 xmins="hTtp://www.w3.org/1999/xmlschema xmlns xdo="urn schemas-microsoft-com xml-xdo" xdo DataSet Name="DocumentElement"> <> 第二部分生成 data xml 20 freshman 20 sophomore Tom 19 grade→fre Susan 20 girl freshman DocumentElement>
第七篇 高级应用 第一部分:生成 schema.Xml 文件: 第二部分生成 data.xml: jimmy 20 boy freshman Mary 20 girl sophomore Tom 19 boy freshman Susan 20 girl freshman