java - 对单个元素而不是整个文档进行 XML 验证

标签 java xml xml-parsing xml-validation

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

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

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

最佳答案

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 来处理验证失败的情况。

关于java - 对单个元素而不是整个文档进行 XML 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13926137/

相关文章:

xml - amazon elastic beanstalk 中的 server.xml 和 tomcat-users.xml 文件位置

android - 解析XML并在TextView中显示

java - 使用 Android SAXParser,我的 XML 元素神秘地分成两半

xml - 创建新节点<xi:include>

java - 解析此 XML 时我做错了什么

未启用使用架构的 Java XML 解析验证

java - weblogic.wsee.jaxws.spi.ClientInstanceInitationHandler NullPointerException

java - 一个 Activity 中有两个 ViewPager

java - Sybase 中的 JDBC 事务控制

java - 如何移动列表条目并同时更新所有条目的索引?