如何根据 XSD 模式验证 XML 结构的单个条目
Posted
技术标签:
【中文标题】如何根据 XSD 模式验证 XML 结构的单个条目【英文标题】:How to validate single entries of a XML structure against an XSD schema 【发布时间】:2021-12-17 21:43:36 【问题描述】:在我的应用程序中,我的数据库中有近 100 万个条目。这些数据被转换成一个/几个 XML 文件,最终通过 XSD 进行验证。如果出现错误,则无法将 XML 文件发送到其目的地。
我不喜欢这种全有或全无的方法,经过长时间的处理失败了。随着数据在一天内(从数据库)进入:有没有办法单独验证每一个条目?由于性能问题,我不想为每个条目创建一个文件,所以我想知道是否有办法将 XSD 提取到 java 对象中,然后在代码中对其进行部分验证?
你能帮忙吗?
【问题讨论】:
【参考方案1】:这几乎是一个架构问题,而不是一个开发问题。以下是一些想法:
当数据进入数据时,您可以将其发布到 Kafka 主题中,订阅者将获取主题中的数据,对其进行验证,然后写入最终文件或对不良记录发出警报.如果支持,您可以在数据库上添加触发器。
您没有描述如何将数据从数据库中提取到 XML 文件中,也许您可以在那里使用分页并创建更小的文件。
您可以使用 Apache Spark 之类的东西,它会使用 JDBC 连接从数据库中读取数据,修改数据帧中的内部表示,然后直接输出文件。 100 万个条目(取决于您的记录的宽度)对于 Spark 来说不算什么。
一些数据库支持 Java 中的用户定义函数,因此您可以直接在数据库级别进行 XSD 验证(确实不是我最喜欢的,但仍然是一个选项)。
注意事项:
您可能知道这一点,但要小心创建数百万个小文件,这会破坏您的系统(因此建议使用 Kafka)。 无论您是在本地还是在云端,建议可能会有所不同,因为您可以利用一些 PaaS 服务。【讨论】:
【参考方案2】:您可以将数据输入到流模式感知 XSLT 3.0 转换中,其逻辑是
<xsl:mode streamable="yes">
<xsl:template match="record">
<xsl:try>
<xsl:copy-of select="." validation="strict"/>
<xsl:catch errors="*"/>
</xsl:try>
</xsl:template>
并且(如果使用 Saxon)您可以通过提供 InvalidityHandler
来捕获验证错误,每次遇到无效数据时都会收到通知。
【讨论】:
以上是关于如何根据 XSD 模式验证 XML 结构的单个条目的主要内容,如果未能解决你的问题,请参考以下文章