当前位置: 首页 > 知识库问答 >
问题:

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

勾炳
2023-03-14

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

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

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

共有2个答案

阴靖
2023-03-14

我想在这种情况下你可以

>

使用您自己的简化模式,它可以只是一个属性文件,元素=规则,规则可以是正则表达式,并创建一个自定义验证器。我认为它将比全面的XSD验证器更快

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

阴阳
2023-03-14

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

我不能百分之百肯定这是validate()的JDK实现的工作方式,但这肯定是Saxon XSD实现解释规范的方式。

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

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

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

 类似资料:
  • 我有结构相当复杂的MongoDB文档: 高层组织(一个要素) 我想通过lastname+firstname+patronym组合在一个查询中进行搜索。查询应该支持多个lastnames、firstnames、patronyms(在$in的帮助下)(用于一个人的不同名字,即jon、john、johny) 我当前的代码返回组织内部有lastname+firstname+patronym组合,但我需要在

  • 问题内容: 我想在单击的HTML文档中获取当前元素(无论是哪个元素)。我在用: 但是非常奇怪的是,我得到了整个文档的文本,而不是单击的元素。 如何仅获取我单击的元素? 例 如果单击“测试”文本,我希望能够在jQuery中使用读取属性。 问题答案: 您需要使用which是最初触发事件的元素。在您的示例代码指。 在jQuery中,就是… 没有jQuery … 另外,请确保是否需要使用<IE9 代替。

  • 我遇到了奇怪的问题,我在网上找不到任何东西。 我使用xpath定位我的xml块,然后用其他内容替换它,例如: 我使用XMLModifier来实际更新令牌(使用updateToken方法:),它用于属性操作或元素的文本(正文)。 我对样式元素有问题,我想处理它的主体,然后用指向某个文件的链接替换整个元素。 显然,更新文本标记将导致样式标记和其中的链接标记。 所以我试着把导航器移到样式元素,得到了这个

  • 对于一个Box2D组合,我需要这段代码来避免无意中的点击: null null 目前,它适用于整个文档。但我希望它仅适用于 。 怎么可能编码呢? 会非常感谢你的帮助!

  • 问题内容: 我有一个用于Go包的测试套件,该套件实现了十二个测试。有时,套件中的一项测试失败了,我想单独重新运行该测试,以节省调试时间。这可能吗,还是每次都必须为此编写一个单独的文件? 问题答案: 使用该标志运行特定的测试。该标志记录在go工具文档的测试标志部分中:

  • 哪个Java并发集合提供数组元素级锁定或数组元素的原子更新。我不想锁定整个数组。只有99%的读操作和1%的写操作。 在数组中写入时锁定可能会阻塞其他线程,这些线程甚至可能不会查看正在由阻塞线程更新的相同元素。