在Java中以编程方式处理XML验证输出

在Java中以编程方式处理XML验证输出,java,xml,xsd,Java,Xml,Xsd,我要解决的问题如下: 给定一个使用XSD(或理想的NVDL)模式“几乎验证”的XML文件,如何以编程方式“修复”该文件 (“几乎验证”意味着某些元素将具有它们不允许具有的属性。可以保证不会出现其他验证错误。“修复”只意味着删除有问题的属性。) 我尝试使用Woodstox的validating writer,但出于某种原因,它不接受我的XSD为有效的(当然,它对于多个导入和抽象类型非常复杂,但它是有效的) 另一种选择是XML验证库,它生成一个输出,然后我可以对其进行解析/处理,并使用它来标识需要删

我要解决的问题如下:

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

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

我尝试使用Woodstox的validating writer,但出于某种原因,它不接受我的XSD为有效的(当然,它对于多个导入和抽象类型非常复杂,但它是有效的)

另一种选择是XML验证库,它生成一个输出,然后我可以对其进行解析/处理,并使用它来标识需要删除的属性

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

如果您想“强制”属性,可以使用XSLT标识转换来过滤不需要的属性或添加缺少的属性。这决不是问题的广泛解决方案,而是属性问题的一个很好的解决方案

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

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

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

问题可能是如果XSD是“外部的”,如何修改它。如果您可以详细说明XSD是如何为您的处理而来源的,那么可能会有更好的建议


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

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

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

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


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

问题在于我事先不知道不需要的属性是什么。还是说运行一个支持模式的XSLT?在这种情况下,您可以先读取XSD,收集每个元素所需的属性,然后遍历DOM树修复每个节点,或者运行SAX处理器并在每个节点出现时检查它们?XSD太复杂了,有抽象类型等等。但是支持模式的XSLT可能会起作用。我对支持模式的XSLT没有做太多的工作,但是当您不知道XSD的先验知识时,您能使用它吗?不幸的是,XSD超出了我的控制范围,甚至在编译时都不知道。我知道修改XSD本身会容易得多,如果可以的话,我早就这么做了。。。。那么你不应该声称“保证”:。。。。显然,即使是一个“静态的”——在“编译时”——XSLT也无法工作。。。您正在进入我称之为“版本屏蔽”的环境,这是一个自动生成的工件(XSLT、Java、.NET),负责根据XSD清理XML数据,然后再到达支持XSD且兼容XSD的XML处理器。我声称这是有保证的,因为它是。我可以验证文档的原始版本,然后通过一个过程添加一些属性(但它添加的属性比它应该添加的更多)。虽然这个过程也超出了我的控制范围,但我可以区分这两个版本,以证明它符合tin上的说明。因此,在一个相当迂回的方式,但我可以说,这是有保证的。