基于 XML 内容的 XSD 验证

Posted

技术标签:

【中文标题】基于 XML 内容的 XSD 验证【英文标题】:XSD validation based on XML content 【发布时间】:2012-04-10 18:16:34 【问题描述】:

我有一个 Java 程序,我必须在其中根据 XSD 模式验证 XML 消息。到目前为止,一切都很好。但是现在我有了一个新要求,根据 XML 消息的内容,部分验证是不同的。

因此,基于一个字段 (1) 的值,某些字段是否可以为空,并且某些枚举是不同的。但是我无法在验证之前解析文档...那我应该如何处理呢?

1) 有 2 个不同的 XSD 文件,将 XML 处理为文本(=丑陋)并提取一个字段来决定应该使用哪个 XSD?

2) 有 3 个不同的 XSD 文件。 2 个不同的选项和一个联合,以便我们可以以匹配 2 个选项的方式进行验证?我们是否可以正确解析 XML、提取字段并决定使用哪个更具体的 XSD 进行额外验证?

3) 其他选项?

【问题讨论】:

“验证前无法解析文档”是什么意思? 如果文档没有经过验证,它很可能是无效的 XML,因此解析会产生异常。 【参考方案1】:

您正在编写自己的 java 验证吗?我建议使用开源或付费验证:XML Schema (XSD) validation tool? 工具。

另外,从您所描述的情况来看,您的架构不再向后兼容,因为您必须基于某些元素使用两个不同的架构,我建议您回复要求并查看架构是否可以更改并更新以保持向后兼容性。这将允许继续为您的 xml 文件使用 1 个架构。

【讨论】:

【参考方案2】:

然后不要使用 JAXB 解析它,而是使用 SAX/StAX 类型解析器(或 DOM,如果你真的想要,尽管如果你只需要少量元素,SAX 会更快)来定位和分析你的元素需要以确定需要使用的正确模式。收集到足够的信息后,中止解析并使用正确的架构验证再次解析。

【讨论】:

马克西姆,谢谢。我不知道我可以在不先验证的情况下使用 SAX 解析它。这解决了我的问题。

以上是关于基于 XML 内容的 XSD 验证的主要内容,如果未能解决你的问题,请参考以下文章

通过 XSD 限制基于另一个元素的 XML 元素

是否可以基于 XSD 方案反序列化 xml 而不是粘贴特殊的结果?

XML 的 XSD 验证失败

如何通过以下 XSD 创建 XML 文件

要针对多个 xsd 模式验证 XML

如何定义XSD并在XML中使用XSD