【问题标题】:XSD validation for multiple entries in a XML对 XML 中的多个条目进行 XSD 验证
【发布时间】:2015-09-11 15:21:06
【问题描述】:

我正在使用 SAXON 解析器在 Java 中进行 XSD 验证。如果我们使用带有单个元素的 XML,它可以正常工作。即使我们有多个元素,它也可以正常工作。但是我们无法确定哪个元素失败,哪个通过了。更清楚地说,我们有一个 XSD 来验证一个带有根元素的简单 xml 文件,其中的其他元素是 <person> <employment></employment></person>。这是可重复的元素。我有一个如下所示的 xml 错误。

<person>
<employment>correct elements inside</employment>
<employment>wrong elements inside </employment>
</person>        

我正在对上述 xml 执行 XSD 验证。由于第二个 &lt;employment&gt; 条目中的错误,它总体上失败了。但我需要的是确定第一份工作通过了,第二份工作失败了。

如何使用 SAXON 实现这一目标?

【问题讨论】:

  • 您的 XML 和 XSD 代码出错了,您可以编辑它吗?
  • xml 示例: 其中 是可重复的。所以我想确定哪个 失败了,哪个通过了。
  • @BalachandarThangavel,请update your Q.,不要在 cmets 中粘贴代码,它不可读并且对任何人都没有帮助。另外,请查看minimal reproducible example 以帮助我们帮助您。
  • 我更新了你的 Q。下次,单击编辑器中的按钮将代码格式化为代码并防止 XML 变得不可见。

标签: java xml validation xsd saxon


【解决方案1】:

您还没有说明您是如何运行验证的:从命令行?来自 JAXP 验证 API?来自 XSLT 还是 XQuery?来自 s9api API?

如果您从命令行运行,则所有验证错误都将输出到 System.err,其中包含有关它们所在位置的位置信息。

如果您从应用程序运行(通过任何 API),则会将错误通知给 ErrorListener。默认的 ErrorListener 的行为类似于命令行 - 它将详细信息写入 System.err。如果它是一个 GUI 应用程序,那么您可能不会看到它,除非您将它重定向到某个窗口。鉴于您对您的要求所说的话,您可能会被建议编写自己的 ErrorListener 以您想要的方式格式化输出。一些 API 提供了一个选项来提供一个 List 对象,在该对象中写入表示发现的验证错误的对象。

在下一个版本 (9.7) 中,我们可以选择以 XML 报告格式生成所有验证错误。

更多信息基于您的回复:

我建议使用 SchemaValidator.setErrorListener() 来设置您自己的 ErrorListener。传递给 ErrorListener 的异常通常是 net.sf.saxon.type.ValidationException 的一个实例。

如果您正在验证内存中的树,则此异常对象上的 ValidationException.getNode() 应该为您提供无效的节点,或者可能是检测到无效的节点,这并不完全相同。

如果您正在验证事件流,例如一个 SAXSource,然后 ValidationException.getPath() 应该给你一个字符串形式的节点路径,而 ValidationException.getAbsolutePath() 应该给你一个结构化形式的路径。

【讨论】:

  • 我正在使用 SAXON9 api 来验证文件。
  • 谢谢@Michael KAy .. 我们使用了相同的,它工作正常
猜你喜欢
  • 2012-09-20
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2013-10-25
  • 1970-01-01
  • 2012-04-13
相关资源
最近更新 更多