JAXB 跳过无效元素并继续处理
JAXB skip invalid elements and continue processing
我有一个应用程序需要处理 XML 以下格式的文件:
<records>
<record/>
<record/>
<record/>
...
</records>
我正在使用 JAXB 来解析这些文件。但是,当由于某些无效数据(例如,int 应该是一个字符)而无法解析其中一条记录时,我正在尝试为不可避免的情况准备我的应用程序。
问题在于,如果 JAXB 无法解析单个记录,它会停止对 整个 文件的处理。这不好——我只需要它来跳过有问题的记录,报告它,然后继续。但是我找不到任何方法来做到这一点。我发现的唯一一件事是 ValidationEventHandler
,它让我 return true
告诉 JAXB 在发生错误时继续处理文件,但问题是它没有实际上 SKIP 有问题的记录 - 它尝试解析它,即使它已知是无效的,这会导致 NumberFormatException
并停止处理。
我找到了这个答案 How to skip a single jaxb element validation contained in a jaxb collection in Spring Batch Job? 但它实际上并没有回答问题,只是建议使用 ValidationEventHandler
即使该功能还不够。
如何跳过无效记录继续处理?我该如何解决这个问题?
如果我知道输入数据可能包含错误并且我需要优雅地恢复,通常我不会使用 JAXB...STAX 可能更适合。但是,Jaxb 确实有一个 "catch all" 你可以使用:https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/annotation/XmlAnyElement.html
我有一个应用程序需要处理 XML 以下格式的文件:
<records>
<record/>
<record/>
<record/>
...
</records>
我正在使用 JAXB 来解析这些文件。但是,当由于某些无效数据(例如,int 应该是一个字符)而无法解析其中一条记录时,我正在尝试为不可避免的情况准备我的应用程序。
问题在于,如果 JAXB 无法解析单个记录,它会停止对 整个 文件的处理。这不好——我只需要它来跳过有问题的记录,报告它,然后继续。但是我找不到任何方法来做到这一点。我发现的唯一一件事是 ValidationEventHandler
,它让我 return true
告诉 JAXB 在发生错误时继续处理文件,但问题是它没有实际上 SKIP 有问题的记录 - 它尝试解析它,即使它已知是无效的,这会导致 NumberFormatException
并停止处理。
我找到了这个答案 How to skip a single jaxb element validation contained in a jaxb collection in Spring Batch Job? 但它实际上并没有回答问题,只是建议使用 ValidationEventHandler
即使该功能还不够。
如何跳过无效记录继续处理?我该如何解决这个问题?
如果我知道输入数据可能包含错误并且我需要优雅地恢复,通常我不会使用 JAXB...STAX 可能更适合。但是,Jaxb 确实有一个 "catch all" 你可以使用:https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/annotation/XmlAnyElement.html