2

在我的一个项目中,我们支持使用 XML 进行数据输入。由于 XML 是用户输入文件,因此它很有可能是有效的 XML,但存在一些语义错误(例如字符串长度大于允许的 limt 等)。

目前我正在使用 javax.xml.validation.Validator 来验证给定的文档,但即使一个元素有语义错误,这也会失败。我想要的是能够跳过这些元素而不是跳过整个 XML。我知道我们可以为验证器设置一个错误处理程序,我可以在其中跳过此类错误,但这意味着我需要在我的应用程序代码中执行语义检查。

我能想到的一种解决方案是解析 XSD 并获取一组限制(例如时间戳格式、长度检查等),然后在解析 XML 时检查这些限制。是否有任何优雅或定义明确的方法来解决这个问题?

4

2 回答 2

1

它在 API 文档中描述得不是很清楚,但是如果您为 validate() 方法提供一个包装您要验证的元素的 DOMSource,它应该只验证该元素下的子树。

我不能 100% 确定这是 validate() 的 JDK 实现的工作方式,但它肯定是 Saxon XSD 实现解释规范的方式。

如果您不想使用低级 Java API,验证特定元素(及其子树)的更简单方法是使用 XQuery:

for $e in //a/b/c[condition=foo] return validate{$e}

使用 XQuery 3.0,您可以使用 try/catch 来处理验证失败的情况。

于 2012-12-18T08:42:19.483 回答
1

我认为在这种情况下你可以

  1. 重写原始 XSD 以便它仅验证您想要的内容

  2. 使用您自己的简化模式,它可能只是一个属性文件,元素=规则,规则可能是一个正则表达式,并制作一个自定义验证器。我认为它会比成熟的 XSD Validator 更快

  3. XSD 不是唯一的 XML 模式语言,请考虑 Relax NG

于 2012-12-18T05:54:41.440 回答