如何根据 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 结构的单个条目的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中针对 XSD 模式验证 json 数据

如何在 C#2.0 中验证 XML 文件

基于 XML 内容的 XSD 验证

xsd 模式文件是不是应该通过对自身的验证?

XML的验证模式DTD与XSD的区别

使用xsd文件验证肥皂xml响应