2

我必须解决的问题如下:

给定一个使用 XSD(或理想情况下是 NVDL)模式“几乎验证”的 XML 文件,我如何以编程方式“修复”该文件?

(“几乎验证”意味着某些元素将具有他们不允许拥有的属性。保证不会有其他验证错误。“修复”只是意味着删除有问题的属性。)

我尝试使用 Woodstox 的验证编写器,但由于某种原因,它不接受我的 XSD 为有效(当然,多个导入和抽象类型非常复杂,但它是有效的)。

另一种方法是生成一个输出的 XML 验证库,然后我可以解析/处理并使用它来识别需要删除的属性。

也欢迎任何其他产生相同最终产品的方法。

4

3 回答 3

1

如果您想“仅强制执行”属性,您可以使用 XSLT 身份转换来过滤不需要的属性或添加缺少的属性。这绝不是对问题的广泛解决方案,而是对属性问题的非常好的解决方案。

但请记住,在 XSLT 转换之后属性的顺序可能会改变,因为属性的顺序不是 XML 的必需属性。

于 2012-06-08T14:16:16.967 回答
1

使用错误处理程序解析您的 XML,该错误处理程序捕获“删除此属性”类型命令对象中检测到的“额外属性”错误。

然后,如果您将这些对象放在“读取 SAX”解析器和“使用 SAX 写入”接收器之间,或者在将 DOM 树重写为 XML 之前在 DOM 树上运行它们,那么这就是实现的问题。

错误处理程序应该处理错误,如果您不希望它成为错误,则错误处理程序不应终止解析。这将为您提供细粒度控制,但代价是编写代码以捕获文档中属性的位置(并稍后对其进行处理)。

根据XML 规范,有效性约束只是“错误”,它为继续处理打开了大门,前提是您的错误处理程序不会停止游戏。有关表明这不应是不可恢复错误的详细信息,请参阅第 1.2 节,这意味着应该可以使用捕获和修复解决方案。

于 2012-06-08T14:34:49.343 回答
0

这是对“其他方法”的回应。我宁愿修改 XSD 以接受任何其他属性:它会减少运行时开销,更不用说使用 XSLT 的所有管道了。

从它的声音来看,你知道并且以某种方式理解/控制 XSD - 你听起来有信心说“保证没有其他验证错误”......因此我的建议。

如果 XSD 是“外部的”,问题可能是如何修改它。如果您可以详细说明如何为您的处理采购 XSD,那么可能会出现更好的建议......

也许您最终还是会使用 XSLT 进行 XSD 到 XSD 的转换;在性能驱动的环境中它仍然会更好,因为您必须为所有XML 执行一次,而不是为每个XML 执行一次。

于 2012-06-08T14:25:28.237 回答