单个元素的XML验证,而不是整个文档

时间:2012-12-18 04:13:29

标签: java xml xml-parsing xml-validation

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

  2. 使用您自己的简化模式,它可能只是一个属性文件,element = rule,rule可以是一个正则表达式,并创建一个自定义验证器。我认为它比完全成熟的XSD验证器

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

答案 1 :(得分:1)

在API文档中没有非常清楚地描述,但是如果你为validate()方法提供一个包装你想要验证的元素的DOMSource,它应该只验证该元素下的子树。

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

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

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

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