问题总结得很好,无论如何,多余的细节从来都不是多余的。
我想使用Apache Forrest创建groovy.xml.MarkupBuilder.文档我显然希望我的文档不仅格式正确,而且根据Forrest DTD也有效。我该如何确保?
答案 0 :(得分:1)
好问题。 AFAIK,唯一的方法是在生成节点后根据DTD验证XML。通常,这将通过单独的过程。有关如何在Java中执行此操作,请参阅this article。(具体取决于版本)。
但要澄清一下:鉴于您完全可以控制生成XML,您希望MarkupBuilder如何帮助确保有效性...如果您尝试创建特定点不允许的节点,则抛出异常? 不完整的XML文档的有效性不是一个明确定义的概念。如果无效是缺少必需的元素怎么办...当你创建它的父节点时,它的子节点都会“丢失”那么MarkupBuilder如何知道何时决定XML无效?或者,如果您发出ID或IDREF类型的属性,并且在发出所有其他ID之前无法检查唯一性或参照完整性,该怎么办?
我无法想象一个真正用于保证有效XML输出的过程,这与在生成后验证输出有很大不同。
在输出过程中肯定有部分验证的方法,即捕获导致无效输出的问题
。但是,Schema-aware XSLT显然可以在生成XML期间进行完整的验证。 http://www.ibm.com/developerworks/xml/library/x-schemaxslt.html#validout上的文章讨论了使用Schema感知的XSLT转换来保证输出有效。我不确定它是如何工作的。也许它验证了它在生成过程中可以做什么,但是对于某些约束,它必须等到输出完成后再发布它才有效。
这不能解答有关Groovy MarkupBuilder的问题,但它揭示了可能的内容。 AFAIK,没有提供模式感知处理的免费XSLT处理器;但Saxon-SA有30天的试用期,也可能是其他商业试验。