java - 如何跳过未使用 JAXB 进行验证的节点

标签 java xml jakarta-ee jaxb unmarshalling

我的 xml 文件看起来是这样的:

<Customers>
    <Customer>
        <name>foo</name>
        <age>18</age>
        <sexe>Male</sexe>
    <Customer>

    <Customer>
         <name>foo1</name>
         <age>25</age>
         <sexe>Female</sexe>
    <Customer>
        .
        .
        .
        .
        .
        .
</Customers>

这是一个巨大的 XML 文件(超过数十万个客户),我需要将其解码然后放入我的数据库中,这是每月的任务。

我需要对其进行一些验证,然后如果客户正确,则将其保存到数据库中,如果客户的任何数据不正确,则记录错误并跳过该客户。

我正在考虑将我的验证规则写入 xsd,然后在使用 ValidationEventHandler 解码期间忽略整个客户。

有人知道我该怎么做吗?或者还有其他解决方案吗?

我在网上搜索了几个小时,但没有找到任何答案。

最佳答案

变体 1 - XML 方法

常见的 XML 处理方法是将验证解析分开。验证步骤通常是针对 XML Schema 来完成的。

  1. XML 验证始终应用于文档级别。也许之前拆分文档(例如每条记录一个 DOM)可以对您的情况有所帮助。请参阅:how to split an XML file into multiple XML files using java
  2. 验证 - 您可以使用 tools like trang to create basic XSD
  3. 从源文档中找出有问题的条目(手动任务 - 归咎于数据提供者)
  4. 仅反序列化好的内容

变体 2 - 纯 Java

也可以使用像 Jackson FasterXML 这样的库创建 XML 数据到 Java 类的相当宽松的映射。 Find here an example关于如何仅读取列表中每个条目的某些属性。

  1. 将所有数据不严格地反序列化为标准 POJO
  2. 在额外的 Java 后处理步骤中验证每个 POJO。

变体 3 - 有所不同

查找每个客户的字节偏移量并将每个客户读取到准备好的 POJO。记录异常并继续下一个。 Find complete approach described here .

  1. 创建字节偏移列表
  2. 对 POJO 进行严格反序列化

关于java - 如何跳过未使用 JAXB 进行验证的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52635779/

相关文章:

java - 屏幕旋转后Resume flowable转为实时数据

Java 多部分帖子

javascript - 从 ckeditor 5 获取 xml

jakarta-ee - JavaEE + Glassfish - BufferUnderflowException

java - org.springframework.jms.JmsSecurityException : Access denied to resource: type=<jms>

java - 深度系统 - 先前的 'top' 项目在更改时闪烁

java - 在 Java 中更改 XML 文件中的一个值的最佳方法是什么?

c# - 使用 < 和 > 解析 XML

java - 使用 @Produces 注释时出现不明确的依赖关系

jsp - 地址栏中的本地主机地址