我正在尝试找到一种可重用的方法来获取CSV文件并从中生成符合指定XSD的XML文件。我还没有找到一个可重复使用的方法。我使用了Altova MapForce,它允许我导入CSV文件和XSD,进行映射而不是从中生成代码,但是只要XSD发生变化,代码就需要重新生成。 Altova也生产了很多代码。
我理想的解决方案是一组Java类,我可以将一个CSV文件提供给XSD,并从中获取XML文件。我找不到这样的东西,我正在考虑可能创造一些东西。
想法?这里有什么东西使用基于this问题的XSLT吗?
感谢。
答案 0 :(得分:7)
这似乎很容易做到,但事实并非如此。 XML Schema是一种文档验证语言,而不是文档生成语言。它没有告诉你如何制作新文件;它会告诉您所制作的文件是否有效。从长远来看,这些并不是一回事。
例如,在XML Schema中创建一个由一系列可选选项组成的复杂类型是微不足道的。 foo
元素可以包含bar
或baz
子元素,然后是baz
或bat
子元素,然后是foo
,{{ 1}},或bar
孩子。这使得规则可以确定这两个元素都是有效的:
bat
与此同时,该规则在确定如何获取数据项元组并从中创建<foo>
<baz/>
<baz/>
<bar/>
</foo>
<foo>
<foo>
<bar/>
</foo>
</foo>
元素方面几乎没有帮助。
通常,当有人问这个问题时,他们会查看他们正在使用的一个或两个模式,这些模式定义了一个相对简单的文档结构。看起来很直观,应该很容易将这些模式用作映射过程的输入。它可能是。什么不容易,甚至可能是一个映射过程,可以将任何模式作为输入。
在我的项目中,我所做的是简化问题。我已经构建了使用CSV和XML并支持模式验证的程序,但在这些程序中,模式是输出。我已经定义了一个简单的XML元数据格式,例如:
foo
然后我可以使用该元数据来控制CSV输入中的XML生成,我也可以 使用它来生成我的程序生成的XML将符合的模式。如果我更改了元数据,我的XML和架构会相应更改。
当然,如果模式真的是您的流程的输入(例如,它们是由第三方提供的),这甚至不会开始帮助您。
答案 1 :(得分:2)
嗯,我真的没有一个现成的,开箱即用的解决方案,但也许:
使用FileHelphers等库读取您的CSV文件;为此,您需要创建一个类MyDataType
来描述CSV中的列,并获得一个MyDataType
如果使用适当的XML序列化属性(如[XmlIgnore]
,[XmlAttribute]
等)修饰该类,您可能只需序列化生成的{{1}数组进入符合XML模式的XML
或者如果这不起作用,您可以创建另一个映射到XML要求的类(从您拥有的XSD生成它),只需定义两种类型MyDataType
之间的映射。 (来自您的CSV)和MyDataType
(针对您的XML)AutoMapper
它不是锅炉 - 但相当接近,你可以把它作为一个“框架”,只需简单地插入你自己的类型(如果你需要经常这样做)。
答案 2 :(得分:1)
如果您的XSLT引擎符合XSLT版本2,那么最好的解决方案就在这里:
答案 3 :(得分:0)
您拥有的是一个“表”(CSV文件),其中包含(可能)表示(可能)分层数据模型的非规范化行。您希望将其映射到基于XSD的任意分层XML文档。
您需要一个工具,可以将分组键列映射到XML元素,并指定哪些数据列包含哪些属性/子元素。这是一个相当重要的问题,除非你的映射是微不足道的。
您可以发布一些CSV和XSD的样本吗?这可能有助于获得更有针对性的答案。
答案 4 :(得分:0)
Microsoft Excel能够导出XML:http://office.microsoft.com/en-us/excel-help/export-xml-data-HP010206401.aspx
我在创建可导出的XSD格式时遇到了一些问题,但是一旦你开始工作,这是一个非常棒的工具。