align=left><b>将二进制数据嵌入 XML 文档的三种方法</b><v:shapetype> <v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path connecttype="rect" gradientshapeok="t" extrusionok="f"></v:path><lock aspectratio="t" v:ext="edit"></lock></v:shapetype><v:shape><v:imagedata></v:imagedata></v:shape><p></p></P>' B' R1 O% `! X$ d9 v* Y8 m
><v:shape><v:imagedata></v:imagedata></v:shape><p></p></P>% k' t% L8 n4 }
><b>将 XML 用于 B2B 应用程序之间的数据传输</b> <p></p></P>/ _1 M( \4 a* P, e
><a href="http://www-900.ibm.com/developerWorks/cn/xml/x-binary/#author1" target="_blank" ><FONT color=#006699>Gowri Shankar</FONT></A>(<a href="mailtvgowri@aquila.co.in" target="_blank" ><FONT color=#006699>vgowri@aquila.co.in</FONT></A>)<p></p></P>1 e/ C- o$ e" h# @3 S7 e2 q
>软件工程师,AQUILA Technologies Pvt.Ltd<p></p></P>; \9 H7 H" M7 H
>2002 年 2 月<p></p></P>, `+ T* y" ]7 L
>XML 用于数据互操作性的主要优点是其可扩展性及其能够以文本格式表示所有形式的数据的能力。甚至当处理二进制数据时,XML 也证明了它的价值。本文集中讨论了在XML中表示二进制数据的三种方法。第一种方法以最适当的方式使用 XML 和 DTD 表示二进制文件或数据源。第二种方法使用一种简单格式,其中每个人都能定义自己的格式来表示二进制数据。在第三种方法中,所有二进制数据都包含在 XML 文件中。<p></p></P>; I) {- A, I* b. Z
>XML 已经改变了完全不同的应用程序 — 这些应用程序使用不同的技术、操作平台和位置 — 之间交换、共享和传输数据的方式。对于所有这些数据的运动,为达到可伸缩性,必须记住的唯一一点是通过启用 HTTP 的标记来包装数据。通过 HTTP 发送数据的最佳途径是使用 XML,有许多原因可以说明它比 HTML 好。<p></p></P>( e8 `) T0 U' r; l: s$ L, a
>最初,HTML 被认为只能处理文本,但是现在它还普遍用于引用和标记非文本数据。所以 XML 步 HTML 后尘是十分自然的。因为 XML 不必遵循特定的语法(象 HTML 那样)并且比 HTML 更具可扩展性,所以人们可以以他们想要标记各类数据的任意方式来使用它。尽管如此,HTTP 通常仍作为传输层使用;因此 XML 在处理二进制数据时必定受到许多约束。当二进制数据是用户或客户机应用程序请求的全部信息的一部分时,XML 只用于标记该二进制数据。而且,在 XML 中包含二进制数据的优点是便于在 HTTP 上传送数据。<p></p></P>- B& Z, N% t+ v$ O' O5 S4 l) ~
><b>演示应用程序:GODOWN 和 AGENT<p></p></b></P>5 W% L; _2 t" g/ {
>在应用程序之间有时候会传输非文本数据。例如,设想有两个 B2B 应用程序:GODOWN 和 AGENT。GODOWN 维护公共库中的所有存货;AGENT 是销售界面。当用户在 AGENT 上选中一个产品名时,就向 GODOWN 提出有关该产品详细信息的请求。以下是操作技巧部分。例如,如果该产品是一块手表,那么应用程序可能显示诸如价格、制造商地址和手表图片等详细信息。如果该产品是一盒迈克杰克逊 CD,那么详细信息可能包括用户可以播放的样品媒体文件。本文将关注于通过 XML 进行数据(二进制数据)定义和描述,以及如何访问这个二进制数据。<p></p></P>; a& J$ H* q! ~
>正如您会发现的那样,在开发时不能决定数据的本质,并且可能需要经 HTTP 传送该数据来提供通用访问。XML 是描述和定义数据的一种非常便利的框架,所以我们使用它来定义库存中的产品 — 库存由 GODOWN 应用程序来维护。<p></p></P>, y$ O$ q" ^: b, t2 F5 @
>让我们看一下这两个应用程序之间进行数据传输过程中的不同阶段。以下是一个数据请求进程的生命周期:<p></p></P>
><b>三种方法<p></p></b></P>
>现在,我们需要将一个应用程序的二进制数据传送到另一个应用程序中。让我们看一下用 XML 文件表示二进制数据或将二进制数据嵌入到 XML 文件中的三种方法,这里简要地列出了这三种方法,下面还有更详细信息:<p></p></P>6 h3 i5 @3 p Y8 _( T
>虽然这三种方法都可以用来表示二进制数据,但不是每种方法都可以适用于任意给定的情况中,而且一种方法未必能很好地替代另一种方法。换句话说,可以同时应用这些方法使之相互协作相互补充。为了详细阐述这一点,让我们考虑示例应用程序。如果您必须维护库中所有产品的详细信息,(以便能对任何产品的请求提供服务),那么最佳方法是使用方法 1 以单一大型 XML 文件的形式来表示数据。甚至方法 2 也适用于这一目的,但是在数据的可扩展性上有某些限制(实体重用等)。当必须传送数据时,如果数据大小相对比较小,那么我们应该应用方法 3。另一种选择是首先高速缓存实体名称和 systemid,然后将详细信息发送到另一个应用程序或方法来处理(下载/显示)数据。在确定哪种方法最适合给定的情况时,尽管没有指导原则或标准,您还是可以识别哪种方法最适合于您的情况。现在应该更详尽地查看这些方法了。<p></p></P>
>第一种方法 — 通过外部实体和标记法的方式来表示二进制数据 — 用来描述数据。正如我们已经看到的,在使用 Request 和 Response 范例的数据访问中本质上有三个阶段。它们是:<p></p></P>7 D' ~. D/ B2 d
>这里,以<I>标记法</I>(称为<I>外部实体</I>)的形式描述二进制数据,通过使用 DTD 来保持数据的持久性。我们应使用第一种方法来进行二进制数据的描述和存储。甚至第二种方法也适用于相同的目的 — 这两种方法的区别在于是否使用 DTD 的应用程序。如果不能确定是否需要 DTD,那么有一个简化的和范围缩小的选项:当产生请求这样一个二进制数据时,可以通过使用 HTTP 将它发送到客户机;然后,客户机应用程序完成一些转换并向用户表示。如果客户机是启用 HTTP 的,象一些浏览器,那么可以将这个 XML 数据转换为 HTML 并显示。但是如果最终用户环境不启用 HTTP,那么我们必须分别下载所有引用的二进制数据源。在这样的情况中,我们必须使用方法 3。当出现请求二进制数据时,读取二进制数据源并打包到 XML 文档中作为以 base64 编码的字符。将之发送到客户机。这个阶段的缺点是数据传送需要更多等待时间,读取和编码需要更多处理时间。当客户机应用程序读取这个 XML 文件时,它对 base64 字符进行解码,将二进制数据写入本地文件系统的一个文件中,并使用那个引用来向最终用户表示这一数据。方法 3 非常适合于二进制数据源不是一张图片或能显示的东西的特定情况;它可以是一个数字签名或一个可执行文件。<p></p></P> N& b8 |& s( U( h' E
><b>通过外部实体和标记法的方式来表示二进制数据<p></p></b></P>* Y% Q/ _" S1 r3 n" n) d
>这是在 XML 文档中表示二进制数据最好的方法。虽然许多人会争论 DTD 使它变得混乱,但是我仍将建议这是非常有效的方法,因为数据在 XML 文档中模块化,并且从 DTD 中抽取二进制数据(源、文件名等)的详细信息。要以这种方法完成操作,您需要了解 XML 和 DTD。查看下面的样本 XML 和<a href="http://www-900.ibm.com/developerWorks/cn/xml/x-binary/listing2.html" target="_blank" ><FONT color=#006699>清单 2</FONT></A> 中的 DTD。<p></p></P>' p- M+ S2 P$ d5 e; l6 q9 B
><B>清单 1. 样本 XML 产品文件:product.xml</B> <p></p></P>0 Z" H2 Z! ^' P, u/ m( ^/ Z, w
RE><CODE> <p></p></CODE></PRE><
RE><CODE><?xml version="1.0"?><p></p></CODE></PRE><
RE><CODE><!DOCTYPE godown SYSTEM "product.dtd"><p></p></CODE></PRE><
RE><CODE><godown><p></p></CODE></PRE><
RE><CODE><product id="1"><p></p></CODE></PRE><
RE><CODE> <name>watch</name><p></p></CODE></PRE><
RE><CODE> <category>HMT Shakthi</category><p></p></CODE></PRE><
RE><CODE> <description>SG CS 07 A</description><p></p></CODE></PRE><
RE><CODE> <price>Rs.500</price><p></p></CODE></PRE><PRE><CODE> <deliverytime>2 days</deliverytime><p></p></CODE></PRE><PRE><CODE> <display object="watch1"></display><p></p></CODE></PRE><PRE><CODE></product><p></p></CODE></PRE><PRE><CODE></godown><p></p></CODE></PRE></TD></TR></TABLE>| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |