Java XML中多个条目的XSD验证

Java XML中多个条目的XSD验证,java,xml,validation,xsd,saxon,Java,Xml,Validation,Xsd,Saxon,我在Java中使用SAXON解析器进行XSD验证。如果我们使用带有单个元素的XML,它就可以正常工作。即使我们有多个元素,它也可以正常工作。但我们无法确定哪个元素失败了,哪个元素通过了。更清楚地说,我们有一个XSD来验证带有根元素的简单xml文件,其中的其他元素是。元素是可重复的。我有一个如下的xml,其中有错误 <person> <employment>correct elements inside</employment> <employment&g

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

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

内部正确的元素
里面有错误的元素
我正在对上述xml执行XSD验证。由于第二个
条目中的错误,它整体失败。但我需要的是确定第一份工作通过了,第二份工作失败了


如何使用SAXON实现这一点?

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

如果您是从命令行运行的,则所有验证错误都会输出到System.err,并包含找到这些错误的位置信息

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

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

根据您的回答提供更多信息:

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

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


如果要验证事件流,例如SAXSource,则ValidationException.getPath()应以字符串的形式为您提供节点的路径,而ValidationException.getAbsolutePath()应以结构化形式为您提供路径。

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

如果您是从命令行运行的,则所有验证错误都会输出到System.err,并包含找到这些错误的位置信息

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

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

根据您的回答提供更多信息:

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

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


如果要验证事件流,例如SAXSource,则ValidationException.getPath()应以字符串的形式为您提供节点的路径,而ValidationException.getAbsolutePath()应以结构化形式为您提供路径。

您的XML和XSD代码失效,您可以在中编辑它吗?示例XML:where is repeatable。所以我想确定哪个失败了,哪个通过了。@BalachandarThangavel,请不要在注释中以这种方式粘贴代码,它是不可读的,对任何人都没有帮助。另外,请查看帮助我们帮助您。我更新了您的Q。下次,请单击编辑器中的按钮将代码格式化为代码并防止XML不可见。您的XML和XSD代码失效,您可以在中编辑吗?示例XML:where is repeatable。所以我想确定哪个失败了,哪个通过了。@BalachandarThangavel,请不要在注释中以这种方式粘贴代码,它是不可读的,对任何人都没有帮助。另外,请查看以帮助我们帮助您。我更新了您的Q。下次,请单击编辑器中的按钮将代码格式化为代码并防止XML不可见。我正在使用SAXON9 api验证文件。谢谢@Michael KAy。。我们使用了相同的方法,而且效果很好。我正在使用Saxon9API验证该文件。谢谢@Michael KAy。。我们使用了相同的,它工作得很好