【问题标题】:How to "Auto-Repair" XML based on XSD?如何“自动修复”基于 XSD 的 XML?
【发布时间】:2014-01-24 13:33:58
【问题描述】:

我有一个 XML 和 XSD 文件。 XML 文件是在 tomcat/ubuntu 平台上使用 Java 生成的。

它用于系统之间的集成。第二个系统正在使用 XSD 验证我的 XML,它说我的 XML 不正确。

我想慢慢修复 XML 文件,但是有一个时间问题。他们希望我的 XML 在 XSD 上比尽快正确。

是否有任何工具/算法可以获取我的 XML 和 XSD。添加不存在的模拟字段。

我想要什么: 我尚未正确的 XML 进入方法并返回与 XSD 正确的 XML。

听起来有些测试框架应该能够做到这一点。

请帮忙。

【问题讨论】:

标签: java xml junit xsd mocking


【解决方案1】:

您所描述的 f(invalid XML, target XSD) = valid XML 几乎不可能以通用方式构建,除了微不足道的 XML/XSD... 这可能是为什么(至少)我不知道有任何主流工具会做这样的事情......(只是给你我对你的问题的简短回答)。

考虑到在 XSD 中描述相同 XML 的方式多种多样,并且可能有多种方式可以使无效的 XML 符合要求(严格来说,有些场景是无法修复的)......找出修复 XML 所需的模式(假设它们的问题一致)并通过自定义脚本应用这些更正(XSLT 可能是其中之一,但我还看到了基于“diffgram”的方法,具体取决于您可用的工具和/或技能)。

我自己在这里回复的兴趣...确实与这样一个事实有关,测试框架(我们有一个,仅在 Windows 上运行)通常能够从各种数据源收集测试数据,并从它基于指定的 XSD 和某种映射元数据。 “映射元数据”可能包含我上面提到的模式所需的数据......

虽然配置这样一个框架可能需要一些时间,具体取决于您的 XML/XSD 中的复杂性...这里的重点是,除了微不足道的任何事情之外,测试框架中也没有太多“自动”发生。

(更新回复:您评论中的模拟/框架方面)

您似乎正在尝试修复本应修复其他内容的内容(即模拟)。如果你需要模拟,那么我的模拟方法就有点不同了,因为我多年前遇到了同样的问题(甚至在诸如 XQuery 或 XML 数据库之类的东西被发明之前)。在最简单的设置中,数据位于电子表格中;一个专有的 XML Builder shapes 数据到分层集,通过遍历由(任意)XSD 描述的内容模型来拉入;数据可以从 Excel 中提取,从外部数据源中查找,默认等。结果可以是一个或多个 XML 片段,然后可以使用 XSLT 或 COBOL 副本进行转换,并保存为文件,或作为流的一部分流式传输基于 TCP/IP 的模拟框架(用于 Web 服务、IMS 事务等)

我所描述的这种模拟方法...将“数据放在首位”,因为我们意识到相同的数据/测试用例可用于测试 Web 服务、IMS 事务、驱动 UI 自动化测试...或其他任何东西一个在企业环境中遇到。 “塑造”数据以符合特定规范(XSD、COBOL Copybook、CSV 等)是“呈现”......因此关注点分离。想象一下,我“注入”您似乎缺少的字段并获取新的 XML 将是多么容易......

【讨论】:

  • 我不同意,要求只是让 XSD 通过并保持当前结构。任何使 XSD 通过的 XML 都是正确的。我可以编写一个循环遍历所有组合的应用程序,返回有效的组合,但它是一个大项目,我今天需要它;-) 谢谢回复
  • @IAdapter,你对细节太模糊了,无法同意或不同意......最后。首先,您假设“当前结构”是有效的……通用工具如何知道这一点?两个 XML 可能在特定区域重叠,但不同的模型可能会导致或结束相同的...一般来说,生成所有可能的组合很有可能非常昂贵(从计算上讲)...如果你可以分享具体的例子,我们可以进行更好的对话...... :)
  • 例如。我有 XML c 并且架构需要 cf。所以我的文档缺少 d 标签。在这种情况下,“非常昂贵”并不重要,因为我只需要一个可以保留现有数据的正确组合,例如 ctestData e>
  • 您正在寻找完美的解决方案,而我正在寻找可行的解决方案。现在我通过在 java 中使用 string.replace 方法来做到这一点。所以我替换(“”,“testData”)。但对我来说太残忍了。
  • 这不适用于生产系统。这是针对现在正在测试中的系统和客户端需要我的 XML 有效,但也不需要静态的假 XML。所以我不得不在 JAXB 框架返回的输出上使用字符串操作来添加缺失的部分。在我可以提取“f”数据并将其以 XML 格式发送给我的客户端后,我将删除模拟。我希望 mock 是智能的,并且它只在“f”为空时添加自己。它应该知道基于 XSD 缺少 f。请记住,在我的案例中,“f”数据不是单个值,而是大约 100 个值。我不得不嘲笑他们。
【解决方案2】:

这是一个有趣的计算机科学挑战,但很难很好地表述。从某种意义上说,这个问题是微不足道的:如果你有一个不符合模式 S 的文档 D,那么你可以通过替换任何已知符合 S 的文档 V 来“修复”D。但这没有用,你真正的want 是一些符合 S 并且在某种意义上“类似于” D 的文档 D';理想情况下,在所有符合 S 的文档中,您希望使用某种合适的度量找到最接近 D 的文档。

我不知道关于这个问题的任何理论或实践工作,但它听起来是一个有趣的研究。除非你明天想要一个答案,在这种情况下忘记它。

【讨论】:

  • 我认为这个框架会很酷。我进行了 JAXB 代码生成来解决我的问题,但通用解决方案对于开源项目来说将是一个非常好的主意。
  • 我什至在考虑自己创建这样的框架。说实话。目标是帮助人们测试集成并给某人 realData + some fakeData 比仅 fakeData 或 real Data 要好得多,但不是 XSD 有效,因此他无法在他选择的工具中解析它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
相关资源
最近更新 更多