2009-11-04 142 views
5

我试图找到一种可重复使用的方式来获取CSV文件并从中生成符合指定XSD的XML文件。我还没有真正找到一个可重复使用的方法。我使用了Altova MapForce,它允许我导入CSV文件和XSD,执行映射,而不是从中生成代码,但是只要XSD更改就需要重新生成代码。 Altova也生产很多代码。使用xsd将csv转换为xml

我的理想解决方案是一组Java类,我可以将CSV文件提供给XSD,并从中获取XML文件。虽然我找不到这样的东西,但我正在考虑创造一些东西。

想法?有没有在这里使用基于this问题的XSLT?

谢谢。

+1

你有没有想过使用XKCD? – 2010-10-13 08:50:03

+0

您还应该指定您在使用(v1或v2?)时受限制的XSLT版本 - 它对最佳答案有很大影响。此外,您是否仅限于一个供应商(哪一个?),还是您需要独立于供应商/平台的解决方案? – 2012-02-02 01:42:07

回答

7

这似乎是一件容易做的事情,但事实并非如此。 XML Schema是一种文档验证语言,而不是文档生成语言。它不会告诉你如何创建一个新的文档;它会告诉你所做的文件是否有效。这些不是一回事。

例如,在由一系列可选选项组成的XML模式中创建复杂类型是很简单的。一个foo元素可以有一个barbaz孩子,然后是一个bazbat孩子,那么foobar,或bat孩子。这使得对于能够确定,这两个元素是有效的规则:

<foo> 
    <baz/> 
    <baz/> 
    <bar/> 
</foo> 

<foo> 
    <foo> 
     <bar/> 
    </foo> 
</foo> 

与此同时,这一规则给你来决定如何采取数据项的元组,并创建一个foo几乎为零的帮助元素从它。

通常,当有人问这个问题时,他们正在查看他们正在使用的一个或两个模式,这些模式定义了一个相对简单的文档结构。看起来很直观,应该很容易将这些模式用作映射过程的输入。它可能是。什么是不容易的,甚至可能的是一个映射过程,可以将任何模式作为输入。

我在项目中所做的就是简化问题。我已经构建了使用CSV和XML并支持模式验证的程序,但在这些程序中,模式是输出。我已经定义了一个简单的XML元数据格式,例如:

<item name="foo" type="string" size="10" allowNulls="true" .../> 
<item name="bar" type="date" allowNulls="false" .../> 

然后我可以使用元数据来控制从CSV输入XML的生产,我可以用它制作的模式,该XML我的程序生产将符合。如果我更改我的元数据,我的XML和模式会适当地更改。

当然,如果模式真的是您的流程的输入(例如他们是由第三方提供的),这甚至不会帮助您。

+0

我喜欢你的解决方案,但对于我目前的需求来说,它不会工作得很好。架构虽然不是由第三方提供,但可能会发生变化(尽管不是很常见),但用户将始终使用我们提供的Excel模板。我可以看到几个我认为这将会非常有用的领域!谢谢! – Casey 2009-11-06 13:45:04

+0

我不同意这不是一件容易的事。这是一件容易的事情。这是一个常见问题,已经解决(针对XSLT v2用户)。 – 2012-02-02 01:40:07

+0

当然,您可以通过一个模式,并且通过跳过可选元素并在任何时候有选择时总是选择第一个选项,您可以生成符合模式的文档。但是架构只能告诉您,除了XML架构包含的其他元数据(如CSV文件中的标题,将标题映射到元素名称的规则以及关于可选元素的约定),如何从CSV文件生成什么XML文档。没有这一点,这不仅不容易,而且也不可能。 – 2012-02-05 00:45:03

2

好了,我真的不对此有一个现成的,出的现成的解决方案,但也许:

  • 阅读您的CSV与像FileHelphers库文件;对于这一点,你需要创建一个类MyDataType它描述CSV列,如果你装饰该类用正确的XML序列化你的MyDataType

  • 数组属性,如[XmlIgnore][XmlAttribute]等等,你可能只能简单地将所得的MyDataType数组序列化为符合您的XML模式的XML

  • 或者如果这样做不起作用,您可以创建另一个映射到您的XML要求的类(从您拥有的XSD),并且只需定义两种类型MyDataType(来自您的CSV)和之间的映射(你的XML)的东西,如AutoMapper

这不是锅炉板 - 但相当接近,你可能会使得这几乎是一个“框架”,只是简单地在自己的类型插入(如果您需要经常这样做)。

0

你有什么是一个单独的“表”(CSV文件),其中包含(可能)非规范化的行代表(可能)分层数据模型。您想将其映射到基于XSD的任意分层XML文档。

您需要一个工具,它可以将分组键列映射到XML元素,并指定哪些数据列进入哪些属性/子元素。这是一个相当重要的问题,除非你的映射是微不足道的。

你可以发布一些CSV和XSD的样本吗?这可能有助于获得更有针对性的答案。