针对 XML 架构 (xsd) 使用大文本元素验证 XML
Validating XML with large text element against XML Schema (xsd)
我必须处理 XML 个可能包含较大(最多 2GB)内容的文件。在这些文件中,内容的 'large' 部分并未分布在整个文件中,而是包含在一个单独的元素中(加密文件,十六进制编码)。
我对文件的来源没有任何影响,所以我需要处理这种情况。
一个要求是保持较小的内存占用空间 (< 500MB)。我能够使用 xml.sax 以流模式读取和处理文件的内容,这很好。
问题是,这些文件还需要根据 XML 模式定义(.xsd 文件)进行验证,xml.sax 似乎不支持。
我找到了一些用于模式验证的最新库,例如 xmlschema,但 none 用于以 streaming/lazy 方式进行验证。
任何人都可以推荐一种方法吗?
许多模式处理器(例如 Xerces 和 Saxon)以流模式运行,因此在验证数据时无需将数据保存在内存中。然而,一个 2Gb 的单个文本节点正在扩展 Java 对字符串和数组大小的限制,甚至流式处理器也很可能希望在内存中保存整个单个节点。
如果此文本节点的内容没有验证约束(例如,您不需要验证它是否有效 xs:base64Binary),那么我建议使用模式验证器(例如 Saxon)接受 SAX 输入,并通过消除或压缩长文本值的 SAX 过滤器提供输入。 SAX 解析器以多个块的形式向 ContentHandler 提供文本,因此 SAX 解析器对文本节点的大小应该没有限制。 Saxon 将尝试将多个块组合成一个字符串(或字符数组),并且可能由于 Java 限制或可用内存量而在此阶段失败;但是如果你的过滤器删除了大文本节点,就不会发生这种情况。
有一个可以压缩长文本的内容过滤器的好主意。这帮助我解决了问题。
我最终写了一个简单的文本收缩器,它通过减少命名标签中的文本内容大小(例如:"only keep the first 64 bytes of the text in the 'Data' and 'CipherValue' elements, don't touch anything else")为我预处理 XML 文件。
生成的文件足够小,可以将其输入验证器,例如 xmlschema。
如果有人需要类似的东西:here is the code of the shrinker
如果用这个,慎用
这确实改变了 XML 的内容并且可能会导致问题,如果 XML 模式定义包含对受影响元素的最小或最大长度检查之类的东西。
我必须处理 XML 个可能包含较大(最多 2GB)内容的文件。在这些文件中,内容的 'large' 部分并未分布在整个文件中,而是包含在一个单独的元素中(加密文件,十六进制编码)。
我对文件的来源没有任何影响,所以我需要处理这种情况。
一个要求是保持较小的内存占用空间 (< 500MB)。我能够使用 xml.sax 以流模式读取和处理文件的内容,这很好。
问题是,这些文件还需要根据 XML 模式定义(.xsd 文件)进行验证,xml.sax 似乎不支持。
我找到了一些用于模式验证的最新库,例如 xmlschema,但 none 用于以 streaming/lazy 方式进行验证。
任何人都可以推荐一种方法吗?
许多模式处理器(例如 Xerces 和 Saxon)以流模式运行,因此在验证数据时无需将数据保存在内存中。然而,一个 2Gb 的单个文本节点正在扩展 Java 对字符串和数组大小的限制,甚至流式处理器也很可能希望在内存中保存整个单个节点。
如果此文本节点的内容没有验证约束(例如,您不需要验证它是否有效 xs:base64Binary),那么我建议使用模式验证器(例如 Saxon)接受 SAX 输入,并通过消除或压缩长文本值的 SAX 过滤器提供输入。 SAX 解析器以多个块的形式向 ContentHandler 提供文本,因此 SAX 解析器对文本节点的大小应该没有限制。 Saxon 将尝试将多个块组合成一个字符串(或字符数组),并且可能由于 Java 限制或可用内存量而在此阶段失败;但是如果你的过滤器删除了大文本节点,就不会发生这种情况。
我最终写了一个简单的文本收缩器,它通过减少命名标签中的文本内容大小(例如:"only keep the first 64 bytes of the text in the 'Data' and 'CipherValue' elements, don't touch anything else")为我预处理 XML 文件。
生成的文件足够小,可以将其输入验证器,例如 xmlschema。
如果有人需要类似的东西:here is the code of the shrinker
如果用这个,慎用
这确实改变了 XML 的内容并且可能会导致问题,如果 XML 模式定义包含对受影响元素的最小或最大长度检查之类的东西。