---
title: "云计算中的XML技术"
date: "2011-01-07"
categories: 
  - "hardware"
tags: 
  - "cloud-services"
  - "databasespy"
  - "missionkit"
description: 探索如何将 Altova 工具连接到 Amazon RDS，构建 MySQL 数据库，并利用 XML 函数来构建基于云的数据库应用程序。
---
Status: #blog

Tags:  #cloud-services #databasespy #missionkit

Categories: [xml](/blog/zh/category/xml.md) [cloud](/blog/zh/category/cloud.md)
# 云计算中的XML技术

## 使用 Altova 工具和亚马逊关系型数据库服务 (Amazon RDS)

越来越多的企业正在发现，将数据库应用程序部署在云端具有诸多优势：

- 高可用性和高可靠性
- 自动伸缩
- 摆脱硬件成本和维护需求

在这篇博文中，我们将演示如何使用 Altova [DatabaseSpy](https://www.altova.com/zh/databasespy.html) 连接到 Amazon 关系数据库服务 (Amazon RDS)，并构建一个小型数据库。 由于 [Altova MissionKit](https://www.altova.com/zh/missionkit/software-development-tools.html) 中的数据库连接向导具有一致性，因此您可以使用 [XMLSpy](https://www.altova.com/zh/xmlspy.html)、[MapForce](https://www.altova.com/zh/mapforce.html) 或 [StyleVision](https://www.altova.com/zh/stylevision.html) 以相同的方式进行连接。 

如果您想按照以下步骤进行操作，您需要注册一个亚马逊云服务 (AWS) 账户，网址是：[http://aws.amazon.com/rds/](http://aws.amazon.com/rds/) 您还可以从以下网址下载 Altova MissionKit 的完整免费试用版，或者下载任何单独的 Altova 应用程序：[https://www.altova.com/download-trial/](https://www.altova.com/zh/download-trial/)

##### 构建一个本地原型

Amazon RDS 基于 MySQL，因此我们将首先在 MySQL Community Edition 中构建一个小型本地数据库，然后将其迁移到 Amazon RDS，并在云端测试我们的数据库。 虽然 MySQL 不支持将 XML 作为数据库列的数据类型，但 MySQL 5.1 和 6.0 版本支持对以文本形式存储的 XML 数据进行一些操作。 在这个练习中，我们将修改和扩展一些 MySQL XML 示例，这些示例可以在以下 MySQL 参考资源中找到：
[http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html](http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html)
[http://dev.mysql.com/tech-resources/articles/xml-in-mysql5.1-6.0.html](http://dev.mysql.com/tech-resources/articles/xml-in-mysql5.1-6.0.html)
[http://dev.mysql.com/tech-resources/articles/mysql-5.1-xml.html](http://dev.mysql.com/tech-resources/articles/mysql-5.1-xml.html)
首先，我们启动了 DatabaseSpy，并连接到本地的 MySQL Community Edition。 我们创建了一个名为“LocalPrototype”的新数据源，并创建了一个名为“XMLtest”的新数据库结构。 以下展示了数据库监控工具的在线浏览器窗口和属性窗口： 

[![数据库Spy 项目和属性窗口](https://lh3.ggpht.com/_REdrfeVqYdU/TSYvog3-1xI/AAAAAAAAAQc/FmMFHyM0-yc/blogSnap1_thumb%5B1%5D.png?imgmax=800 "DatabaseSpy Project and Properties windows")](http://lh6.ggpht.com/_REdrfeVqYdU/TSYvoDdXvWI/AAAAAAAAAQU/qEea5H03j3U/s1600-h/blogSnap1%5B3%5D.png) 

接下来，我们创建了两个名为“books”（书籍）和“cities”（城市）的表，并按照MySQL文档中的示例插入了数据。以下是我们在DatabaseSpy中创建的表的结构视图： 

[![数据库Spy的设计视图](https://lh5.ggpht.com/_REdrfeVqYdU/TSYvpYyta6I/AAAAAAAAAQk/3oJcRfcVafs/blogSnap2_thumb%5B1%5D.png?imgmax=800 "DatabaseSpy Design View")](http://lh5.ggpht.com/_REdrfeVqYdU/TSYvpNqGrlI/AAAAAAAAAQg/m15NZt1yLgU/s1600-h/blogSnap2%5B3%5D.png) 

我们可以执行特定的查询，并在堆叠的结果窗口中显示表格的内容

[![DatabaseSpy 的堆叠结果窗口](https://lh6.ggpht.com/_REdrfeVqYdU/TSYvxCJz7BI/AAAAAAAAAQs/KrKbkgW_cKc/blogSnap3_thumb%5B1%5D.png?imgmax=800 "DatabaseSpy stacked results windows")](http://lh5.ggpht.com/_REdrfeVqYdU/TSYvqaOVCqI/AAAAAAAAAQo/sDFsYLrNi7k/s1600-h/blogSnap3%5B3%5D.png)

请注意，"books" 表中的 "doc" 列包含 XML 数据，尽管它被定义为 varchar(150) 类型。MySQL 提供了两个用于处理文本字段中 XML 数据的函数：ExtractValue() 和 UpdateXML()，这两个函数可以通过 XPath 表达式对单个元素进行操作。以下是一个简单的 ExtractValue() 查询，用于从 "books" 表的每一行中提取作者的姓名首字母： 

[![`ExtractValue()` 函数](https://lh3.ggpht.com/_REdrfeVqYdU/TSYvyNUEhfI/AAAAAAAAAQ0/JOPn0w1ZAOA/blogSnap4_thumb%5B1%5D.png?imgmax=800 "ExtractValue( ) function")](http://lh4.ggpht.com/_REdrfeVqYdU/TSYvxiQrogI/AAAAAAAAAQw/rlT5OA5cB-M/s1600-h/blogSnap4%5B3%5D.png) 

`UpdateXML()` 函数可以用于使用 SQL 表达式修改单个 XML 元素的內容。在下面的截图中，第一行的查询更新了我们 "books" 表中的每一行，而第二行的查询返回了新的值： 

[![`UpdateXML()` 函数](https://lh4.ggpht.com/_REdrfeVqYdU/TSYvyzem2KI/AAAAAAAAAQ8/BCW9ZEzc77k/blogSnap5_thumb%5B1%5D.png?imgmax=800 "UpdateXML( ) function")](http://lh5.ggpht.com/_REdrfeVqYdU/TSYvyTiRDNI/AAAAAAAAAQ4/qna29a6Bw6o/s1600-h/blogSnap5%5B3%5D.png)

我们还可以使用 `Concat()` 函数将 XML 元素添加到非 XML 数据中，例如城市表，具体示例如下： 

[![`Concat()` 函数](https://lh3.ggpht.com/_REdrfeVqYdU/TSYvz4jJO8I/AAAAAAAAARE/GECrInoROUM/blogSnap6_thumb%5B1%5D.png?imgmax=800 "Concat( ) function")](http://lh4.ggpht.com/_REdrfeVqYdU/TSYvzdA02MI/AAAAAAAAARA/IHlT_sKpzAk/s1600-h/blogSnap6%5B3%5D.png)

到目前为止，我们的 XML 查询操作的是每个表的每一行。为了方便查询单行数据，建议在表中增加一列，用于存储唯一的行索引。我们可以复制我们的“books”表，并在其中增加一列，命名为“id”，用于存储行索引。 “id”列还可以作为方便的外部键，用于从另一个表中的某一行，引用我们表中对应的单个 XML 文档。 

例如，您可以定义一个表来存储应聘者的姓名，并使用外键来引用存储在另一个表中的、以XML格式存储的每位应聘者的简历。您可以使用DatabaseSpy中的[SQL编辑器](https://www.altova.com/zh/databasespy/sql-editor.html)来生成现有表的CREATE语句，并直接对其进行编辑；或者，您可以使用DatabaseSpy的[设计编辑器](https://www.altova.com/zh/databasespy/database-design.html)以图形方式创建表。（有关更多信息，请参阅[Altova](https://www.altova.com/zh/)网站上的[DatabaseSpy](https://www.altova.com/zh/databasespy.html)部分。） 

由于我们计划稍后在 Amazon RDS 上运行相同的查询，因此我们将一个 SQL 创建语句和多个 SQL 插入语句合并成一个脚本，用于创建名为 "books2" 的表。以下截图显示了该脚本的一部分： 

[![创建表脚本](https://lh5.ggpht.com/_REdrfeVqYdU/TSYwOm9o6qI/AAAAAAAAARM/DRJQIGyrS7M/blogSnap6a_thumb%5B3%5D.png?imgmax=800 "Create table script")](http://lh5.ggpht.com/_REdrfeVqYdU/TSYv0JrSNhI/AAAAAAAAARI/T4-ylo2HPaY/s1600-h/blogSnap6a%5B7%5D.png) 

我们可以对 "books2" 表执行一个查询，该查询将显示每一行中唯一的 "id" 列 

[![SQL SELECT 查询语句](https://lh6.ggpht.com/_REdrfeVqYdU/TSYwQHmnPoI/AAAAAAAAARU/Mi1mEaTUMU4/blogSnap7_thumb%5B4%5D.png?imgmax=800 "SQL SELECT query")](http://lh3.ggpht.com/_REdrfeVqYdU/TSYwPEtwIdI/AAAAAAAAARQ/gPgwsQX94Ak/s1600-h/blogSnap7%5B8%5D.png) 

现在，我们可以改进 `UpdateXML()` 和 `ExtractValue()` 查询，使其能够针对单个行进行操作 

[![博客快照8](https://lh5.ggpht.com/_REdrfeVqYdU/TSYyzesZA8I/AAAAAAAAARc/Le1Qs6k4GMY/blogSnap8_thumb%5B2%5D.png?imgmax=800 "blogSnap8")](http://lh4.ggpht.com/_REdrfeVqYdU/TSYwQfREjtI/AAAAAAAAARY/sUtXyDoOq7A/s1600-h/blogSnap8%5B6%5D.png) [![博客快照9](https://lh5.ggpht.com/_REdrfeVqYdU/TSYy0nw8n2I/AAAAAAAAARk/hRPWhnmcudI/blogSnap9_thumb%5B1%5D.png?imgmax=800 "blogSnap9")](http://lh6.ggpht.com/_REdrfeVqYdU/TSYy0LgjvmI/AAAAAAAAARg/yh-JtXmQR2U/s1600-h/blogSnap9%5B3%5D.png) 

这为我们提供了一组很好的基础示例，我们可以将其迁移到云端，并在 Amazon RDS 上进行测试。

## 将 DatabaseSpy 连接到 Amazon RDS 云服务

在您按照以下说明操作后， [AWS 管理控制台](http://aws.amazon.com/console/) 要在 Amazon RDS 上创建数据库实例，连接向导可以帮助您轻松开始使用 DatabaseSpy。只需选择“MySQL”选项，如上图所示： 

[![数据库侦察工具连接向导](https://lh5.ggpht.com/_REdrfeVqYdU/TSYy1HzeX7I/AAAAAAAAARs/OV62tBUdU1g/blogSnap10_thumb%5B1%5D.png?imgmax=800 "DatabaseSpy Connection Wizard")](http://lh4.ggpht.com/_REdrfeVqYdU/TSYy04hWtSI/AAAAAAAAARo/ePZmjb3wIbM/s1600-h/blogSnap10%5B3%5D.png) 

首次连接时，您需要创建一个新的数据源名称 (DSN)。 之后，您可以通过选择“使用现有数据源名称”选项，从列表中选择已有的 DSN。 即使您要从 XMLSpy、MapForce 或 StyleVision 重新连接，您也可以使用最初创建的 DSN。

[![连接到 MySQL](https://lh5.ggpht.com/_REdrfeVqYdU/TSYy2KLWVjI/AAAAAAAAAR0/P_SfoWqNqmk/blogSnap11_thumb%5B1%5D.png?imgmax=800 "Connecting to MySQL")](http://lh5.ggpht.com/_REdrfeVqYdU/TSYy1s8cwkI/AAAAAAAAARw/Vo8A8G5y5k4/s1600-h/blogSnap11%5B3%5D.png) 

在连接器对话框中，请填写以下信息：

- **数据源名称：** 这是将在 DatabaseSpy 项目窗口中以及重新连接时显示在现有数据源列表中的名称。
- **描述：** 仅供您参考。
- **服务器：** 这是您在 Amazon RDS 账户仪表板中列出的终端节点名称。
- **端口：** 3306 – 请确保您的IT部门没有使用防火墙阻止该端口！
- **用户名/密码**：这是您在 Amazon RDS 中设置的用户。
- **数据库：** 您在启动 RDS 实例时配置的默认数据库名称。

[![MySQL ODBC 连接器](https://lh4.ggpht.com/_REdrfeVqYdU/TSYy3A4BZNI/AAAAAAAAAR8/MQ-j5h1PdMQ/blogSnap12_thumb%5B1%5D.png?imgmax=800 "MySQL Connector/ODBC")](http://lh6.ggpht.com/_REdrfeVqYdU/TSYy2g81jPI/AAAAAAAAAR4/yz8-Isp-rCY/s1600-h/blogSnap12%5B3%5D.png) 

我们连接到位于亚马逊云端的RDS数据库，使用的与之前为本地原型构建的DatabaseSpy项目相同的项目。以下是项目窗口的截图，其中显示了数据源名称以及我们添加到项目中的SQL文件： 

[![带有云连接的 DatabaseSpy 项目窗口](https://lh6.ggpht.com/_REdrfeVqYdU/TSYy4Z2yQAI/AAAAAAAAASE/jjkGuAVBZYY/blogSnap15_thumb%5B1%5D.png?imgmax=800 "DatabaseSpy Project window with cloud connection")](http://lh5.ggpht.com/_REdrfeVqYdU/TSYy3qGsQpI/AAAAAAAAASA/hC99hBGpc3Y/s1600-h/blogSnap15%5B3%5D.png) 

在创建表和运行查询之前，了解各个系统的版本信息会很有帮助。以下截图展示了一个查询，该查询用于获取每个系统的版本信息。请注意，每个查询上方灰色的条形表示该 SQKL 语句所使用的数据库连接。 

[![本地服务器报告的版本](https://lh3.ggpht.com/_REdrfeVqYdU/TSYy5G-k3SI/AAAAAAAAASM/WwjShCXN8NM/blogSnap16_thumb%5B1%5D.png?imgmax=800 "Version reported by the local server")](http://lh5.ggpht.com/_REdrfeVqYdU/TSYy4w4Lt3I/AAAAAAAAASI/7HQFtTCam7g/s1600-h/blogSnap16%5B3%5D.png) 

[![云服务器报告的版本信息](https://lh5.ggpht.com/_REdrfeVqYdU/TSYy6bIVXoI/AAAAAAAAASU/-JyDD32Kp2g/blogSnap17_thumb%5B1%5D.png?imgmax=800 "Version reported by the cloud server")](http://lh3.ggpht.com/_REdrfeVqYdU/TSYy6A4UeJI/AAAAAAAAASQ/G1YLJDmUqrQ/s1600-h/blogSnap17%5B3%5D.png) 

Amazon RDS 的报告显示，它正在运行 MySQL Community Server 的 5.1 版本，与我们本地的测试版本相同——这是一个令人鼓舞的迹象！

## 将本地项目迁移到云端

我们可以打开我们最初创建表的脚本，然后在云数据库中运行它们。只需在“属性”窗口中重新指定执行目标即可 

[![在“数据库侦察工具”属性窗口中，选择数据源](https://lh5.ggpht.com/_REdrfeVqYdU/TSYy7_iTcXI/AAAAAAAAASc/q0X1LX25ZVI/blogSnap19_thumb%5B1%5D.png?imgmax=800 "Data Source selection in the DatabaseSpy Properties window")](http://lh6.ggpht.com/_REdrfeVqYdU/TSYy7SFih4I/AAAAAAAAASY/u2ciH6xLgA4/s1600-h/blogSnap19%5B3%5D.png) 

SQL 编辑器窗口顶部附近的灰色“执行目标”栏，用于标识云端 Amazon RDS 数据库作为查询的目标

[![DatabaseSpy SQL 编辑器窗口](https://lh6.ggpht.com/_REdrfeVqYdU/TSYy8UqW2LI/AAAAAAAAASk/f8LxhxA5KVE/blogSnap18_thumb%5B1%5D.png?imgmax=800 "DatabaseSpy SQL Editor window")](http://lh6.ggpht.com/_REdrfeVqYdU/TSYy8HAL2UI/AAAAAAAAASg/rrrnJEP-cZ8/s1600-h/blogSnap18%5B3%5D.png) 

在类似地创建了 "books" 和 "books2" 表之后，我们可以分别在云数据库中运行这些 SQL 查询。以下是一个使用 ExtractValue() 函数处理所有行的示例： 

[![`ExtractValue()` 函数](https://lh6.ggpht.com/_REdrfeVqYdU/TSYy9LMPvLI/AAAAAAAAASs/ELCuIt6yr6A/blogSnap20_thumb%5B2%5D.png?imgmax=800 "ExtractValue( ) function")](http://lh6.ggpht.com/_REdrfeVqYdU/TSYy8xnwAYI/AAAAAAAAASo/ZiXvT3Dpt3M/s1600-h/blogSnap20%5B6%5D.png) 

使用 `Concat()` 查询，从表格中的非 XML 数据生成 XML 输出 

[![使用 Concat() 函数将 XML 元素添加到非 XML 表中的数据](https://lh4.ggpht.com/_REdrfeVqYdU/TSYy-KZdIUI/AAAAAAAAAS0/tBjejnmSxt8/blogSnap21_thumb%5B1%5D.png?imgmax=800 "Using the Concat( ) function to add XML elements to data from a non-XML table")](http://lh5.ggpht.com/_REdrfeVqYdU/TSYy9ozYo3I/AAAAAAAAASw/hiDcxS51Fg8/s1600-h/blogSnap21%5B3%5D.png)

`UpdateXML()` 函数的一个示例，用于更新表格中单行数据。

[![在 Amazon RDS 云服务中使用 UpdateXML() 函数](https://lh6.ggpht.com/_REdrfeVqYdU/TSYy-5p4W0I/AAAAAAAAAS8/S-IU7BoJrc4/blogSnap22_thumb%5B1%5D.png?imgmax=800 "Using the UpdateXML( ) function in the Amazon RDS cloud")](http://lh5.ggpht.com/_REdrfeVqYdU/TSYy-egtAMI/AAAAAAAAAS4/bEza7pRhyTs/s1600-h/blogSnap22%5B3%5D.png) 

提取单行数据的方法： 

[![blogSnap23](https://lh5.ggpht.com/_REdrfeVqYdU/TSYy_qnwgsI/AAAAAAAAATE/gRjQHwNgX3w/blogSnap23_thumb%5B1%5D.png?imgmax=800 "blogSnap23")](http://lh5.ggpht.com/_REdrfeVqYdU/TSYy_ePFw3I/AAAAAAAAATA/gc3yssi4DvI/s1600-h/blogSnap23%5B3%5D.png)

## 结论

在我们的每一次测试中，Amazon RDS 的表现与本地的 MySQL 社区版完全一致。 这种行为使得开发人员能够更高效地构建和测试新的云数据库应用程序，或者对现有应用程序进行改进，而无需为开发迭代过程产生额外的云资源成本。 

我们还验证了 MySQL XML 函数在云数据库中，用于存储在文本列中的 XML 数据的操作。我们的 XML 数据量非常有限，因为我们书籍表中用于存储 XML 数据的文本列的长度限制为 150 个字符。但是，MySQL 允许您在一个列中存储更大的 XML 文档。每个表的最大行大小为 65,535 字节。即使您的表使用了索引列，这意味着用于存储一个 XML 条目的 varchar 列的长度可能超过 64KB。如果您需要存储更大的 XML 文档，MySQL 提供了 MediumText 和 LongText 数据类型，类似于 BLOB。MediumText 可以存储超过 1600 万个单字节字符，而 LongText 可以存储高达 4GB 的数据。虽然本文中没有详细说明，但我们已经成功测试了 ExtractValue() 和 UpdateXML() 函数，并使用了 MediumText 和 LongText 数据类型。

当您需要存储大型的 XML 数据文件时，编写 XPath 表达式来定位单个元素可能会成为一项开发难题。XMLSpy 包含的 XPath 分析器是一个非常有用的工具，它可以帮助您进行 XPath 1.0 和 2.0 表达式的[测试和调试](https://www.altova.com/zh/xmlspy/xpath-analyzer.html)。当您在分析器中输入一个 XPath 表达式时，XMLSpy 会实时对其进行评估，并返回相应的结果节点集。这可以节省您在尝试理解和解决 XPath 问题时花费的大量调试时间。 

在未来的博文中，我们将探讨 XMLSpy、MapForce、DiffDog 和 DatabaseSpy 等工具如何帮助开发人员加速在 Amazon RDS 上构建云应用程序。我们期待您的再次光临！如果您想亲身体验 Altova 工具与 Amazon RDS 的良好兼容性， [下载免费试用版](https://www.altova.com/zh/download/missionkit/software_development_tools_enterprise.html) 的 [Altova MissionKit 套件](https://www.altova.com/zh/missionkit/software-development-tools.html).
