5

我正在做一个项目,我们需要以 XML 格式保存数据。问题是,随着时间的推移,我们预计数据的格式/架构会发生变化。我们想要做的是生成脚本来跨不同的模式版本迁移我们的数据。我们将我们的产品分发给成千上万的客户,因此我们需要能够在客户站点上运行/应用这些脚本(因此我们不能只手动进行转换)。我认为我们正在寻找的是某种 XML 数据迁移工具。在我看来,理想的工具可以:

  1. 对两个模式进行“XML diff”以识别添加/删除/更改的节点。

  2. 允许我们指定转换函数。因此,例如,我们可能会在模式中添加一个新元素,它是旧元素的函数。(例如,一个新元素 C,其中 C = A+B,A + B 是旧元素)。

所以我想我正在寻找一种 XML 差异和补丁工具,它也可以应用转换功能。我正在寻找的一个工具是Altova 的 MapForce。我确信这里的其他人不得不处理 XML 数据格式迁移。你是怎么处理的呢?

编辑:澄清一点。我计划做的“差异”是在模式或 .xsd 文件上。将对遵循给定模式的特定数据集进行实际更改。这些数据集将是 .xml 文件。因此,它是模式的“差异”,可帮助确定需要对数据集进行哪些更改才能将它们从一个方案迁移到另一个方案。

4

3 回答 3

5

“对两个模式进行“XML diff”以识别添加/删除/更改的节点。”

XSD 是文本,所以这很简单。

但是,如果您对 XSD 进行重大的结构更改,那么自动 diff 将在很大程度上无用。

如果您对 XSD 进行小的、美观的更改,这可能会有所帮助。

“允许我们指定转换函数……”

那不是很好吗。可悲的是,发生一些微不足道的变化(“新元素 C,其中 C = A+B,A + B 是旧元素”)的可能性几乎为零。为什么要做这种微不足道的改变?

不,当您“......将我们的产品分发给成千上万的客户”时,您不会做出微不足道的、表面上的改变。您保存更改,以便它们真正具有史诗般的效果,并“创造重大价值”。

不,自动模式迁移的几率几乎为零。

相反,设计可迁移性。

  1. 确保版本号在 XSD 路径中很显眼。理想情况下,在 XSD 名称本身中。

  2. 每个 XSD 更改都是一个严重的治理问题 (SGI™)。每个人都参与。然后您就可以立即编写迁移脚本。不是之后。不是用工具。但作为 XSD 更改的一部分。

    架构不会自发改变。有人更改它们是有原因的。有人可以指定更改,以便其他人可以编写(或更新)迁移脚本。

这太严重了,不能相信“自动化”工具。这需要真正的人的真正大脑真正专注于这一点,就好像他们的工作依赖于它一样。

于 2009-08-05T00:52:22.297 回答
3

我最终编写了一个工具来执行此操作,并将结果作为 SourceForge 项目发布。

内容: 此工具有助于创建脚本以将 XML 数据从 XML 模式的一个版本迁移到同一模式的更高版本。该工具通过区分 XSD 文件并发出 XSLT 2.0 来自动迁移 XML 数据来创建这些脚本。这适用于简单的数据更改,并且可以用作更复杂数据更改的“起始”代码。

其中: https ://sourceforge.net/projects/xsdevolver/

背景: 我工作的公司销售一个收缩包装的应用程序,我们根据指定的 XSD 模式以 XML 格式保存工作簿。随着时间的推移,我们预计此模式的格式会发生变化。我们想要一种方法来帮助我们区分模式版本,因为它们随着时间的推移而演变,并生成初始 XSLT 以将数据从旧版本的模式迁移到新版本的模式。

用法:

XMLSchemaEvolver SchemaVersion1.xsd SchemaVersion2.xsd

输出:

  1. 显示哪些元素已更改的模式差异

  2. XSLT 将 XML 数据从 SchemaVersion1 转换为 SchemaVersion2

它是如何工作的?

基本思想是这样的:

1) 对两个 xml 模式 (xsd) 文件进行比较。

2) 每个更改都分类为 INSERT、DELETE、MOVE 或 RENAME 操作。

3) 对于这些操作中的每一个,发出简单的 XSLT 以执行所需的数据更改。

4) 这些数据更改操作是根据 Jesper Tverskov链接文本建议的一组标准 XSLT 操作建模的。可以在文档文件夹中的 XSLT Transformations.txt 中找到我们代码发出的转换的完整列表。

于 2010-05-31T02:08:15.230 回答
0

As @S.Lott says, the ability to automate transformations is unlikely. However, XSLT is a fantastic tool for formally defining how to transform XML from one format to another. It can't be automatically generated (as far as I know), but it's well worth doing things this way.

于 2009-08-05T01:12:19.463 回答