验证针对XSD的csv

时间:2013-01-08 19:15:22

标签: java xml xsd xml-validation

我们有一个扁平的XSD,因此我们不是以XML格式存储数据,而是考虑以CSV格式存储,因为数据可能非常庞大。假设我们从XSD知道CSV中每条记录的元素类型,有没有办法使用基于Java的XML Validator验证CSV中的每条记录对XSD​​?

3 个答案:

答案 0 :(得分:3)

Saxon XSD验证器用作SAX过滤器,因此您可以通过发送表示输入的XML视图的SAX事件来进行验证。所以你需要的只是一个Java程序,它读取CSV文件并发出表示其内容的SAX事件,SAX事件通过管道传输到XSD验证器。

答案 1 :(得分:1)

这样做的一种方法是执行以下操作:

  • 使用JAXB编译器从XSD
  • 创建Java类
  • 使用类似于Flatworm的产品自动/声明性地将您的记录(或整个文件)解析为上面创建的Java类,或者只是手工等等。
  • 使用发布here on SO的方法验证图表。只需确保适当缓存,即重用验证器和JAXBContext对象。

鉴于ask的性质,即使作为JAXBSource,编组到XML所产生的开销也是不可避免的。你可以做的就是充分利用它...如果CPU带宽不是问题,你可以尝试并行化以提高吞吐量(每个线程需要一个验证器,上次我使用它时JAXBContent是线程安全的)。我会避免加载整个文件,如果有人认为所有记录的XSD(如在匹配记录的元素中将是一个具有maxOccurs =“unbounded”的粒子)将是一种更有效的验证方式...对于大文件,你的内存不足,很可能......

对于大量数据,使用XSD可以标记为优雅,但效率不高。对于在寻找.NET解决方案时遇到这篇文章的人,通过调用{{}来验证单个字段更有效(假设XSD没有跨字段约束等) 3}}而不是。

答案 2 :(得分:1)

“扁平XSD”和“每个记录的元素类型”是什么意思?显然,一些转换或适应过程涉及将非XML格式提供给期望XML输入的验证器。因此,必须提供所有相关名称。

特别是,除非您有一个额外的列(通常在行的开头),否则您将没有足够的空间来编码与整行对应的元素的名称。这与第一行中其他列的名称是子元素(上级)还是属性(下级)无关。

然后,假设适配器可以使用此名称,那么“平面XSD”是什么样的?如果此元素是模式的根元素或顶级元素(即模式描述只有一个行),则必须使用新的顶级元素扩展模式以充当容器行序列,这是您的CSV文件。换句话说,您应该将整个CSV文件作为单个XML文档进行验证,而不是将每行验证为单独的XML文档。

如果您的验证器可以使用管道输入,那么您只需要使用任何方便的脚本语言编写的CSV到XML转换器。