XML 体系结构
这一节讨论就系统体系结构的特定方面而言 XML 技术最有效的应用。通过这一节读者应该能够:
- 确定涉及到 XML 应用的系统领域
- 为系统的不同部分选择最合适的 XML 技术,兼顾性能和安全
- 理解如何将 XML 绑定到 Java
XML 的应用无所不在,如用于动态网页的 Asynchronous JavaScript and XML (Ajax),以及用于博客和提要的
Rich Site Summary (RSS)。将来还会更多。本系列主要讨论核心 技术,包括 Simple API for XML
(SAX)、文档对象模型(DOM)、DTD、XML Schema、XPath、XLink 和 XQuery。
您会遇到大量的缩写词。随便阅读几篇技术文章就会看到 XDI、RDF、REST、SVG、XUL 等等。这是因为 XML 不仅仅是一个热点话题,而且是一个超级热点话题。为什么会出现这种情况?主要原因在于
XML 为数据提供了跨平台、跨语言的能力,就像 Java 为应用程序逻辑提供了跨平台支持一样。我们来看看最近为世界市场带来冲击的一些
XML 用法:
- 提要(RSS 和 Atom)
- 动态 Web(Ajax)
- 博客(代表性状态传输,Representational State Transfer 或者 REST)
- 面向服务的体系结构(SOA)和 Web 服务
这些应用如 图 1 和 图 2 所示,这两个图分别说明了如何在电子商务应用程序体系结构和动态 Web 中集成 XML。
图 1. 使用 XML 技术的电子商务
图 2. 使用 XML 技术的动态 Web
为了从这些应用中获益,需要良好的 XML 技术基础,这正是本系列所要提供的。
什么是体系结构,它与 XML 有什么关系?
“体系结构是有序引入变更的一种框架。” —— Tom DeMarco
如果曾经由于不够优化的系统体系结构而在深夜里收到请求支持的电话,就会知道明智地选择所用的技术有多么重要。体系结构有很多差别,包括物理的和逻辑的。图
3 显示了一种物理体系结构。
图 3. 物理体系结构的例子
“系统的基本组织体现在组成它的组件、组件之间以及组件和环境之间的关系、控制系统设计和演化的基本原则之中。” —— ANSI/IEEE
1471-2000, Recommended Practice for Architecture Description of
Software-Intensive Systems
系统体系结构有多种不同的定义。在本教程中,我们将软件系统体系结构看作:
- 尽量在已有结构的基础上构建(比如扩展框架和重用公共组件)
- 根据需要在进程和处理器之间分配,系统各部分公开有接口
特定的技术可用于体系结构的某个方面但不能用于其他方面。在 图 3 中的示例系统中,XML 可用于多个方面:
- 浏览器
可以使用 XML 内容和相关的 XSL 样式表来呈现网页。XSLT 提供了这种功能,并且支持多种不同格式的转换。
- 客户机请求
XMLHttpRequest 是 Ajax 的核心。
- 服务器响应
如果返回的是 XMLHttpRequest,响应内容可能采用 XML 格式。即便不是 XML,浏览器仍然使用 DOM 操纵
Web 页面。在本系列的第 3 部分中,您将看到 DOM 是从 XML 发展起来的。
- Web 服务
SOAP 是一种基于 XML 的协议,用于通过 HTTP 交换信息(换句话说,就是通过 Web)。主要用于请求远程 Web
服务。它是 XML 远程过程调用(RPC)的后继者。
- Java Message Service (JMS)
JMS 用于在进程间异步发送消息。连接和延迟问题通过可靠的传递来弥补。消息的 XML 内容提供了一种混合语言,双方都能理解,无论是用什么语言或者运行在什么平台上。
- 报告
除了在 Web 浏览器、PDA 和其他设备上呈现之外,还可以把 XML 作为报告呈现。除了呈现网页内容外,XSLT 还可用于以多种格式呈现报告。
- 数据库
现在已经不是上一代人曾经用过的数据库了。为了避免错失 XML 的良机,IBM? 和 Oracle 都提供了存储 XML 文档结构并支持
XQuery 的原生 XML 数据库。本系列的第 3 部分将详细讨论这个话题,现在只要记住 XML 本质上是普通文本,因此即使没有
XML 感知的数据库,也可以将 XML 存储在扁平文件和数据库中。
这仅仅是体系结构的一个例子。Kevin Dick 出版的 XML: A Managers Guide(第 216 页,参见
参考资料)列举了五种不同的企业应用程序,都能通过 XML 的使用获得很大好处:
- 劳动力自动化
- 知识管理
- 贸易伙伴协调
- 应用程序集成
- 数据集成
其核心观点是 XML 可用于多种不同的领域,包括您从事的领域。
现在您了解了 XML 可用于什么地方,但是选择哪种技术以及在系统的什么地方真正应用它呢?下面将讨论这方面的一些问题,请继续读下去。
在现有的应用程序中使用 XML
XML 的一个强大之处在于它能够被不同的系统所理解。如果有一个现存的应用程序,无论是用 C 编写、在 Linux? 机器上运行的,还是用
Java 编写、在 Microsoft? Windows? 机器上运行的,您都可以通过基于 XML 的通信,将遗留应用程序集成到系统的其他部分中。
另外,有些产品和框架使用 XML 作为配置文件。比如,struts 使用 struts-config.xml 文件定义如何控制
servlet,Web 应用程序使用 web.xml 文件定义如何部署在服务器上运行的应用程序。更多关于 XML 的外围应用不断涌现。您的应用程序当然也能很好地利用这些能力。
但是本教程主要讨论 XML 技术与应用程序更加核心、集成的应用。表 1 列出了应用程序的一些特征,并给出了什么时候可以运用 XML
技术的建议。
表 1. 应用 XML 的建议
特征 |
讨论 |
建议 |
输出目标和格式(PDA、浏览器、ipod、PDF)
|
数据类型越多,XML 转换的优势越明显。
|
如果需要多种输出格式可以使用 XML。 |
内容的大小 |
内容越多,使用 XML 需要克服的性能障碍越大。这就需要考虑其他方法,比如压缩或者另一种完全不同的格式,比如 Abstract
Syntax Notation One (ASN.1),这种格式损失了人类可读的优点。
|
在消息传递和处理效率不及标准工具的互操作性和可用性重要时使用 XML。 |
互操作性
|
XML 最强大的地方无疑就是它提供了不同系统能够理解的跨语言、跨平台的格式。
|
在不同系统需要通信的情况下使用 XML。 |
搜索
|
XML 通过 XPath 支持相对简单的查询,最新的 XQuery 则支持更复杂的查询。XML 搜索技术虽然日渐成熟,但仍然比较弱。XML
感知数据库是否有助于解决这个问题还有待于观察,因为它们用树结构存储 XML。请参阅 XML 感知数据库。
|
在搜索功能很重要的情况下,不要使用 XML 文档。相反,应该把内容保存到数据库中,或者使用 XML 感知数据库。 |
摘要
|
XML 技术在摘要数据方面比较弱,比如生成报告。请参阅 XML 感知数据库。 |
在摘要功能很重要的情况下,不要使用 XML 文档。相反,应该把内容保存到数据库中,或者使用 XML 感知数据库。 |
项目规模
|
使用 XML 需要解析器和代码来处理 XML 事件或树。
|
对于需求简单的小型项目,可能不需要承担 XML 的开销。 |
XML 感知数据库
数据库厂商希望支持使用 XML 技术的项目,但是关系数据库存储和检索 XML 文件不是很方便。IBM 推出了原来称为 Viper
的 DB2? 新版本,支持用原生格式存储和索引 XML 数据(换句话说,不是把 XML 分解开来以便适应关系模型)。存储 XML
的数据库支持 XQuery,XQuery 是相当于 SQL 的 XML 等价物。
那么这些新出现的数据库能力对您的项目意味着什么呢?主要是能够使原生形式的 XML 数据获得典型的数据库能力,比如搜索和摘要。
性能
这一节讨论使用 XML 技术可能影响性能的一些问题。
选择适当的处理模型
正如 Designing Web Services with the J2EE? 1.4 Platform: JAX-RPC,
SOAP, and XML Technologies(参见 参考资料)这本书中指出的那样,通过下列 API 有四种主要的 XML
处理模型可供选择:
1. SAX:提供了一种基于事件的编程模型
2. DOM:提供了一种内存树遍历编程模型
3. XML 数据绑定:提供了一种内存 Java 内容类绑定编程模型
4. XSLT:提供了一种基于模板的编程模型
SAX 和 DOM 是最常见的编程模型。与 XSLT 一起,这两种模型都可通过 Java API for XML Processing
(JAXP) 使用。XML 数据绑定模型可以通过 JAXB 技术使用。
所有这些技术都将在本系列后面的教程中讨论,但是首先来看看各种处理模型对性能的影响。表 2 比较了 SAX 解析器和 DOM 解析器的一些特性。
表 2. 解析器:SAX 和 DOM
SAX
|
DOM |
事件驱动 |
树操作 |
可以处理很大的文档,内存占用基本不变 |
文档越大占用内存越多 |
修改内容必须写入新的文档 |
可以在内存中操纵文档 |
管理复杂的修改更困难 |
进行复杂的修改比较容易 |
一般来说更快一些 |
相对较慢 |
对解析的控制更多,但是可能需要更多的编程 |
一般来说比较省事 |
跟多数事情一样,系统需求通常决定了要使用的解析器。下面是一些例子:
- 合并文档
当然需要使用 DOM 树。使用 SAX 一个标记一个标记地合并,想一想就可怕。
- 小型设备
如果需要考虑内存,SAX 使用的内存非常少。DOM 必须建立整个文档的树结构。
- 查找特定标记
如果遇到特定标记时发生某个事件,SAX 非常适合。
- 复杂的操作
如果需要根据文档中其他部分的数据修改文档的不同部分,使用 DOM 解析器可能更容易一些。
最后,还可以结合使用两种解析器。比方说,可以用 SAX 解析器解析一些小型文档提取需要合并到已有文档中的信息,然后使用 DOM
解析器和树操作修改文档。
缓存样式表
如果使用 XSLT 将 XML 文档转化成不同格式,可以在内存中缓存编译后的线程安全的样式表 Template,供不同的用户创建自己的
Transformer 来重用这些对象(如 图 4 所示)。因而可以减少应用程序的内存占用,还能节约解析和编译样式表的时间。
图 4. 缓存 XSLT 样式表
使用名称空间
您可能已经知道,名称空间用于在文档中声明独立于其他地方声明的名称。在样式表和其他文档通过 include 或 import 之类的语句结合起来时,在合并使用不同文法的多个文档时,都可能会出现问题。如果在元素或属性名中使用冒号,在使用名称空间的情况下可以区分名称空间前缀(冒号左侧的部分)和名称(即名称空间的本地部分)。比如,xmlns:prefix=URI
允许使用这样的名称:prefix:myname。
本系列的后一个教程将详细讨论名称空间。但是现在希望提一下名称空间对性能的影响。如前所述,SAX 是基于事件的解析器。如果解析器遇到名称空间声明,就会向应用程序发出
startPrefixMapping 调用和 endPrefixMapping 调用。这些回调会降低应用程序的处理速度。并不是说完全避免使用名称空间,事实上也不可能这样做,而是说如果性能比较重要的话应该谨慎地使用名称空间。
绑定到 Java 类
众所周知,XML 文档以纯文本的格式包含标记和其他内容。因此对性能极为不利。如何提高性能呢?我想讨论两种方法:JAXB 和 XSLT
Compiler (XSLTC)。
JAXB
JAXB 解析 XML 文档并创建表示文档内容的 Java 对象的语义树(如 图 5 所示)。然后可以根据相关 XML 模式中的规则操作这些对象,该
XML 模式实现已经被编译并用于创建 JAXB 绑定框架。还可以使用该框架将树编组成 XML 文档。
除了处理文档更快以外,JAXB 还使您能够通过 Java 对象操纵 XML。此外,JAXB 也使得跟踪模式的变化更容易了。
图 5. JAXB
注意:JAXB 不 支持 DTD,所以您必须使用 XML Schema 作为模式语言。
XSLT Compiler
您知道 XSL Transformation 是什么。XSLTC 在其中增加了编译的部分。XLSTC 是两部分的结合(如 图
6 所示)。第一部分是一个编译器,用于从 XSL 样式表创建 translet,即一组 Java 类。第二部分是一个处理程序,将
translet 应用于 XML 实例文档,以将其转化成目标输出格式。因而可以在解析样式表后多次重用,从而加快处理速度。
图 6. XSLTC
安全
如果在 Internet 上通信,应用程序必须保证端到端的数据安全。无论谁的计算机感染了病毒,或者谁的站点被黑了,都会引起对保护公司信息安全的重视。
那么用什么来保护 XML 通信呢?从本质上说,通过 Internet 安全发送 XML 文档涉及到 XML 加密和 XML 数字签名。
XML 加密是指将内容转化成难以理解的形式来保护机密信息。当然,目标接受方必须能够将其转换成原来的形式。XML 加密还有某些特殊的能力,比如能够加密特定的元素或者元素内容。这种功能在有些情况下非常有用,比如发生在客户、供应商和客户银行之间的销售事务,其中参与各方需要阅读文档内容的某些部分而不能看到其他部分。
XML 数字签名解决 XML 安全的完整性问题(换句话说,判定内容是否被修改了)。与 XML 加密一样,XML 数字签名也能用于更小的粒度
—— 换句话说,可以签署文档的某些部分。
与 XML 数字签名有关的问题,比如在文档操作中保持属性的顺序,确保文档可以在通信的接收方能够被验证。这些内容超出了本教程的范围,但是可以通过
JavaWorld 网站(参见 参考资料)进一步了解这方面的内容。
结束语
XML 技术在市场上有各种不同的应用。XML 成功结合到应用程序体系结构中的关键在于确定在什么地方使用它们利用其长处。对于核心
XML 技术的了解以及对不同体系结构的掌握是在项目中成功引入 XML 的关键。
总结
- 本教程的主题是体系结构,从中学到了如何:
- 确定给定的体系结构对于 XML 设计考虑因素意味着什么
- 为给定的体系结构选择适当的 XML 技术
- 评估 XML 解析、验证和转换的性能
- 使用 JAXB 实现 Java 类
- 使用 XML 加密和签名解决 XML 安全
|