715_XML 高级编程.pdf
《715_XML 高级编程.pdf》由会员分享,可在线阅读,更多相关《715_XML 高级编程.pdf(59页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、F i x H i s t o r y B i n d i n g()函数执行动态更新操作,在本章的实例研究中,我们已经多次看到类似的操作。唯一的特殊之处在于我们绑定的是重复的 H T M L元素。根据XML DSO,表格的每一行与一个P r o j R e p o r t元素匹配。P r o j Tr a c k.h t m l只需要提供包含一行的模板。下面是程序设计阶段存在的表格:程序清单1 6-2 8当我们获取数据时,I N P U T和T E X TA R E A元素与p r o j N a m e、p r o j I D Te x t和p r o j D e t a i l动态绑定。
2、我们首先删除当前文档中除第一个节点之外的所有节点,之所以保留第一个节点是为了防止绑定失败。然后,添加所有新节点,最后删除旧文档的其余节点:程序清单1 6-2 9第16章 实例研究2XML和分布式应用程序使用715下载16.11.2 服务器端一旦H i s t o r y.a s p接收到我们的查询文档,它就从根节点开始处理:P r o c e s s H i s t o r y Q u e r y()负责将X M L转化为SQL SELECT语句。这类S Q L语句类似于以下形式:在执行查询之前,P r o c e s s H i s t o r y Q u e r y()利用函数M a k
3、e H i s t C o n s t r a i n t()构造S Q L语句的查询条件:程序清单1 6-3 0发出查询命令之后,程序必须依次处理结果记录集合中的每条记录,并将每一行作为一个成员写入C o l l e c t i o n文档:716使用XML 高级编程下载程序清单1 6-3 1以下是两个辅助性函数:M a k e H i s t C o n s t r a i n t()和Wr i t e H i s t B o d y()。M a k e H i s t C o n s t r a i n t()从查询文档中提取程序员 I D,并构造 SQL WHERE从句的核心部分。Wr
4、 i t e H i s t B o d y()是在函数P r o c e s s H i s t o r y Q u e r y()中调用的,它将数据库查询的结果转化为要发送给客户端的X M L文档:程序清单1 6-3 2第16章 实例研究2XML和分布式应用程序使用717下载16.12 经验教训既然我们已经完成了本章开始提出的用于管理程序的项目,现在应该根据提出的开发原则对我们的工作进行评价。应用程序能够满足项目的功能需求,只需要极少的代码,就能够保证平台独立性。在本例中,采用了特定平台的技术用于可视化表示的数据绑定但是我们将它与服务器端的代码实现相分离。类似地,服务器端使用了 A D O
5、和关系型数据库,但是它对客户端是屏蔽的。这种设计方式提高了代码重用的可能性。特别是服务器页面可以“原封不动地”与其他客户端应用程序配合使用。然而,我们的工作并非尽善尽美。我们犯的错误将用以说明我们提出的开发原则的价值。16.12.1 违反的开发原则数据绑定迫使我们的程序员将 I T S t a ff e r词汇表与程序员表单以及 P r o j R e p o r t词汇表与成果报告历史表单紧密结合。实际上,我们并不能将之称为违背开发原则,至少在缺少公认的元数据标准的情况下。使用数据绑定极大地简化了编程任务,而且使客户端能够具有简洁的用户界面。然而,词汇表的改变会严重影响到客户端应用程序。由于
6、我们在代码中没有区分 I T S t a ff e r和S t a ff e r元素,因此丧失了绝好的代码重用机会。在本例中,这两个元素的差别极小,因此没有理由使用附加的代码。然而,在现实世界中,我们要建立用于处理普通S t a ff e r词汇表的函数,然后用其他函数处理特殊的 I T S t a ff e r词汇表。专有化的函数将调用通用函数中已经实现的功能,以处理 I T S t a ff e r文档的通用部分(S t a ff e r元素)。16.12.2 组件程序因使用了M S X M L及其相关接口、XML DSO和I X M L H T T P而得到简化。虽然这使得我们的客户浏览
7、器局限于Microsoft Internet Explorer 5.0,但是要想通过自己的编程代替这些组件提供的主要功能非常困难。我们特定的应用程序可以完全在服务器上执行,它用 A S P编写,返回H T M L。然而,这种方法使得其他应用程序无法重用我们实现的服务,特别是自动化的客户。我们鼓励的代码重用是以客户编程为代价的。然而,我们确实有所损失。我们没有创建任何自己的组件。特别是,我们的开发原则提倡在每一层都使用组件,并将组件数据转化为 X M L在平台之间传递。哪里有与I T S t a ff e r和P o r j R e p o r t相关的组件?我们本应该使用JavaScript
8、将I T S t a ff e r类创建为C O M组件。应该利用它检查是否违反了字段限制或业务规则。例如,可以根据企业职称分类数据库检查某个职称是否合法。在应用程序的服务器端,这类组件非常有价值。在我们这个仅仅用于说明 X M L应用的例子中,不可能也没有必要采取这种方式,然而在现实世界中,这是至关重要的。事实上,其他应用程序只能重用本例中的脚本,而无法重用完整的代码。如果不编辑源代码,本例没有任何可重用的组件。16.12.3 重用的可能性然而,本章介绍的应用程序中有两个资源是将来可重用的:分别由 H i s t o r y.a s p和S t a ff.a s p表示的服务。这些服务是通用
9、的,而且符合我们的开发原则,因此任何需要这些词汇表的应用程718使用XML 高级编程下载序可以调用它们。这就是协作网络应用程序的目的。你开发服务,通过目录列表发布它。由于这些服务有已知的接口,因此客户应用程序可以使用它们。在本例中,接口包含X M L词汇表。如果这些词汇表能够忠实地反应商业运作中的某个有用部分,它们本身就是可重用的资源。16.13 小结在本章中,我们介绍了将 X M L与A S P相结合的基本方法。看到 X M L非常适于A S P和动态文档生成。使用了一些特定平台的工具,主要是 M S X M L的I X M L H T T P接口和数据绑定。如果要保证应用程序的平台独立性,
10、需要将所有处理移至服务器端,使用与平台无关的组件,或者针对不同的浏览器产生不同的客户页面版本。我们看到了普通的编程方法在I n t r a n e t和I n t e r n e t应用程序设计中暴露出的问题。例如:处理日益增长的复杂性。不灵活的应用程序。代码重复。转向自动化We b任务。分布式开发和实施小组。在We b开发中,为了克服以上弱点,我提出了五条原则:从粗粒度服务构建应用程序。通过查询目录发现服务。将服务提供为自描述数据。服务应该是短暂的。服务必须可扩展,且能够降低对外部的要求。最后,我将理论与实践相结合。事实证明,X M L是一种能够实现这五条原则的出色技术。A S P也非常适于
11、构建基于We b的服务。总而言之,如果要建立功能强大的 We b应用程序,而且要满足松散连接的网络和应用程序的特殊需求,A S P和X M L是最合适的选择。第16章 实例研究2XML和分布式应用程序使用719下载下载第17章实例研究3图书目录信息服务在本章的实例研究中,我们将在S A X和X P a t h的基础上创建强大的图书目录信息服务(B C I S)。该系统允许出版者上载描述图书内容的 X M L目录文件,过滤其中的详细信息,然后以 X M L或H T M L的格式通过电子邮件传递给系统的订阅者。两种传输格式都提供了 U R L,通过它们可以查看书目,并在 A m a z o n.c
12、 o m进行在线购买。这些 U R L都是根据图书的 I S B N和A m a z o n目前的We b站点结构动态生成的。它们并没有包含在原始的源文档中,这意味着 B C I S系统具备包含到任何在线书店链接的潜力,这主要取决于订阅者的喜好。B C I S必须具备扩展性,能够处理任意大小的 X M L目录文件,所以它使用 S A X解析器来访问所有的X M L数据文档。我们曾经在本书前面的一些章节中讨论过,S A X解析器在处理前并不把整个X M L文档调入到内存中,而且在任何时候都只在内存中保留文档的一小部分内存的确切使用数量取决于文档中的元素嵌套情况。这意味着对能够处理的文件大小并没有
13、上限限制,也不必关心处理过程中使用的内存数量。这两点都非常重要。如果系统在 D O M中载入文档,通常情况下它会受到可用内存数量的限制,或者因为分页而运行得非常缓慢。B C I S是根据出版商/购买者之间的推模式规划的:出版商(服务器)直接把图书的细节传递给购买者(客户),而不是购买者向出版者索取相应的信息。B C I S的订阅者可以选择两种图书目录(例如与A S P、X M L等等有关的图书),过滤出需要传递给自己的信息。所以,如果出版商上载的目录文件包含 8 000本关于花园的图书,25 000本关于汽车的图书,2本关于X M L的图书,那么注册时仅表示出对X M L兴趣的订阅者只会收到关
14、于这2本X M L图书的信息。出版商/购买者之间的推模式有几个关键的优势,使得它对于许多应用来说是一个极具吸引力的选择:它节省了购买者的时间,因为不再需要翻阅出版商的信息,以了解最新变化。它使得信息发布者能够节省宝贵的资源和带宽,因为服务器不再需要处理和服务由客户端可能发出的大量请求(因为没有发生什么变化)。出版者知道订阅者更希望了解的是信息,所以不再依赖于读者记得回到源位置来查看是否有更新信息。可能时下最流行的出版商/购买者服务的应用就是新闻邮件和 We b站点的更新通知。在这两种情况下,出版商知道客户端感兴趣的是他们所提供的信息,或者提供的特定服务,所以在相关事件(例如We b站点中增加了
15、新页面)发生时会把信息用电子邮件通知客户。当客户接收到信息时,会在空闲时阅读其中的内容,再决定是否采取进一步的动作,例如点击可能包含在电子邮件当中的超链接。这些类型的应用也可能根据过滤、传输、从服务器向客户端传递数据的原则进行构建。这意味着 B C I S的编制风格使它很容易就能支持任何类型的信息和传输机制。正是出于这一原因,这类应用的设计看起来稍微有些复杂,但我们希望在本章结束时大家能够理解其中的原理。到本章结束时,我们将了解到:如何在Visual Basic中使用S A X解析器处理任意大小的X M L文档,且无须使用太多的内存。注意,虽然我们使用的是 V B,我将保证大家能够掌握这类应用
16、如何用任意语言实现,因此我们也将解释任何“V B主义”的内容,虽然对于那些只进行过 C/C+或J a v a编程的人来说这有一些古怪。一种有趣的X S LT替代品,通过将元代码用于模版,能够实现高性能的、编译过的样式表。如何开发一个基于X M L的推模式程序,它适用于许多不同的应用。17.1 图书目录信息服务在B C I S中有三种目标客户类型:订阅者根据所选择的两个目录,使用这类服务接收有关书籍的信息(过滤的数量可以是任意数量,之所以本例中为两个是为了减少代码的复杂性)。出版商希望把它们的书籍的信息传递给订阅者的公司或个人。广告商类似A m a z o n.c o m这样的公司,它们在线销售
17、书籍,并向在传递给订阅者的信息中包含到它们的超链接的服务支付费用。如果一名广告商既是出版商,又是订阅者也不足为奇。在本章的实例研究中,我们不会特别讨论出版商。他们负责创建 X M L目录文件,其中包含将由系统处理的图书信息。正如我们稍后将看到的,在本实例研究中,B C I S与订阅者之间的交互仅仅包括将图书目录文件拷贝到某个文件目录中。这种方法使得公司很容易将信息发布到B C I S服务器上,它们只需通过 F T P将X M L文档上传,但这也意味着你可能需要扩展系统,你应该决定对于推销给订阅者的每本书,是否向出版商收费。本章的实例研究也很少涉及广告商,我们将实现的系统仅支持一个广告商,而且它
18、是在转换代码中硬编码的。你当然可以对此进行扩展,使之包含多家公司。17.1.1 系统概述B C I S的系统结构如图1 7-1所示。出版商创建一个X M L文档(显示为C a t a l o g.X M L),其中包含要过滤的所有信息,他将这个文件推给订阅者。文件U s e r s.X M L定义了订阅者及其过滤器。本章描述的系统并不提供用于管理该文件的 U I,因此为了增加更多的信息或者改变配置,你不得不(使用类似记事本的工具)手工修正和编辑这个文件。S A X用户个性化引擎加载用户信息,并根据每个用户的设置转换图书信息,为每个用户创建一个输出文件。根据我们已经讨论过的出版/订阅模型,每个转
19、换后的文件可以通过电子邮件发送给用户。1.XML文档格式订阅者信息和图书信息保存在不同的(独立的)X M L文档中。由于我们使用的 S A X解析器不支持有效性验证,因此系统不使用 D T D或模式验证文件的有效性。实际上,这一点对于我们第17章 实例研究3图书目录信息服务使用721下载的实例研究没有很大的影响,但是它意味着如果你从本实例中派生出的系统需要有效性验证,你必须亲自进行验证(例如:保证根元素名称正确等)。图 17-1(1)Catalog.XML本章的实例研究提供了一个 X M L目录样例,名为C a t a l o g.x m l,该文件及本书的其余代码均可以从站点h t t p:
20、/w w w.w r o x.c o m/下载。该文件中包含的图书信息文件的格式是我们非常熟悉的,我们在本书中一直沿用这种格式。程序清单1 7-1以上X M L文档有根元素,它能够包含任意数量的 元素。每个元素722使用XML 高级编程下载SAX用户个性化引擎出版创建订阅着1订阅着3都有多个子元素,它们的含义不言自明,而且我们在以前的章节中曾详细介绍过。(2)Users.XML本章的实例研究中提供的 X M L用户文件样例名为U s e r s.X M L。有关B C I S中订阅者的信息定义如下:程序清单1 7-2以上X M L的根元素为,它能够包含任意数量的元素。每个元素有多个子元素(其中
21、只能包含文本内容):表1 7-1子元素说明订阅者的姓名,用于记录日志转换时输出文件的名称(可选的)如果存在,将根据该地址通过电子邮件发送给用户指定应用于用户的转换样式表类。它的值可以是 X M L或H T M L用户感兴趣的第一个图书目录。它与使用 X P a t h/C a t a l o g/B o o k/R e c S u b j C a t e g o r i e s/C a t e g o r y的X M L目录文件匹配用户感兴趣的第二个图书目录。它与 匹配对于本章介绍的实例研究,你可以进行扩展,例如:使之支持任意多个目录元素。为了简化代码,我仅仅实现了两个第17章 实例研究3图书
22、目录信息服务使用723下载(3)投递格式B C I S允许订阅者以 H T M L格式或X M L格式接收图书信息。图 1 7-2显示了H T M L投递格式,其中目录过滤器是使用A S P和A S P+编写的。图 17-2转换过程创建了一个非常简单的 H T M L输出文件,实际上,它只显示了两个原始的 X M L输入字段(书名和摘要)。它根据简单的算法计算到 A m a z o n的链接,该算法首先删除 I S B N号中的连字符,然后在前面增加前缀h t t p:/w w w.a m a z o n.c o m/e x e c/o b i d o s/A S I N/。X M L格式同样
23、相当简洁,参见图1 7-3。图 17-3724使用XML 高级编程下载以上两个转换过程都是由V B类模块执行的,我们稍后会介绍有关内容。2.订阅者/用户如前所述,订阅者是 B C I S实例研究中最重要的实体,因为他们负责定义应用于源 X M L目录文档的过滤规则,投递格式(H T M L或X M L),以及可选的电子邮件地址。订阅者是使用类C U s e r模型化的,类C U s e r C o l l e c t i o n用于以组为单位管理订阅者(参见图 1 7-4)。图 17-4上图(及本章其他类似的图)采用U M L表示法。我们描述一下这种表示法:它使用一个框表示类,框被分为三部分。
24、顶部显示类名,中部显示属性(及类型),下部显示方法(以及参数和类型)。框之间的箭头表示拥有或包含等关系,箭头上的数字表示关系的元组数(一对一,一对多等)。在上图中,C U s e r C o l l e c t i o n包含零个或多个C U s e r对象。要了解更多的信息,参见Instant UML(ISBN:1-861000-87-1)。出版商和广告商并没有被模型化,因为系统并不介意谁创建了 X M L目录文件,而且我们只讨论到A m a z o n的链接。如果决定扩展系统,以每个用户/出版的每本书为单位向出版社收费,或者支持多个广告商,我们就需要将它们模型化,因为在那种情况下它们与订阅
25、者同等重要。(1)VB集合说明当我们使用V B编写B C I S时,所有集合类都是使用类构造器附件创建的。我虽然使用类构造器,但通常将变量名由m v a r重命名为m _,并且使用匈牙利表示法表示变量的前缀。在设计过程中,我不打算详细解释集合类,因为它们在现实世界中的角色非常简单:它们包含零个或多个相同类的对象。然而,考虑到有些人以前可能从未使用过V B,我将简要介绍C U s e r C o l l e c t i o n类的N e w E n u m()方法。N e w E n u m()方法允许我们使用如下的F o r.E a c h语法书写代码:程序清单1 7-3第17章 实例研究3图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 715_XML 高级编程 715 _XML 高级 编程
限制150内