使用XSD将CSV转换为XML

5

我正在尝试找到一种可重复使用的方法,将CSV文件转换为符合指定XSD规范的XML文件。目前还没有找到一种可重复使用的方法。我使用了Altova MapForce,它可以让我导入CSV文件和XSD文件进行映射,并生成相应的代码,但是每当XSD发生变化时就需要重新生成代码。Altova还会生成大量代码。

我的理想解决方案是一组Java类,我可以将CSV文件和XSD文件提供给它们,然后获得相应的XML文件。但我找不到类似的东西,因此考虑可能要创建一些东西。

有什么想法吗?是否可以根据这个问题中提到的内容,使用基于XSLT的解决方案呢?

谢谢。


2
你有没有考虑使用xkcd? - user82238
你还应该指定你所限制使用的XSLT版本(v1或v2?)- 这对于最佳答案有很大影响。此外,你是否受限于一个供应商(哪一个?),或者你需要一个供应商/平台无关的解决方案? - Sean B. Durkin
5个回答

8
这似乎是一件容易的事情,但实际上并不是。XML Schema 是一种文档验证语言,而不是文档生成语言。它不能告诉你如何创建一个新文档;它只能告诉你你所创建的文档是否有效。这两者完全不同。
例如,在 XML Schema 中创建一个由可选选择序列组成的复杂类型非常简单。一个 foo 元素可以有一个 barbaz 子元素,然后可以有一个 bazbat 子元素,最后是一个 foobarbat 子元素。这样就可以确定这两个元素都是有效的规则。
<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和模式也会相应更改。

当然,如果模式真正是您的过程的输入(例如,它们由第三方提供),这将根本无法帮助您。


我喜欢你的解决方案,但对于我的当前需求来说可能不太适用。虽然模式不是由第三方提供的,但可能会发生变化(尽管不是很频繁),但用户始终会使用我们提供的Excel模板。不过,我可以看到一些地方,我认为这将非常有用!谢谢! - Casey
我不同意这不是一件容易的事情。这是一件容易的事情。这是一个常见的问题,而且已经被解决了(对于XSLT v2用户)。 - Sean B. Durkin
当然,您可以通过跳过可选元素并始终在有选择时选择第一个选项来遍历模式,并生成符合模式的文档。但是,如果除了XML模式之外没有其他元数据(例如CSV文件中的标题以及将标题映射到元素名称的规则和关于可选元素的约定),那么模式只能告诉您从CSV文件生成什么样的XML文档。没有这个,不仅不容易,而且不可能。 - Robert Rossney

2
嗯,对于这个问题我没有现成的解决方案,但或许可以考虑以下方法:
  • 使用像FileHelpers这样的库读取你的CSV文件; 为此,你需要创建一个描述CSV中列的类MyDataType,然后得到一个MyDataType数组。

  • 如果你使用适当的XML序列化属性(如[XmlIgnore], [XmlAttribute]等)装饰该类,你可能能够将结果数组直接序列化为符合你的XML模式的XML。

  • 或者,如果前面的方法行不通,你可以创建另一个类以满足你的XML要求(可以从你现有的XSD生成),然后只需用AutoMapper之类的工具在两种类型MyDataType(来自CSV)和MyXmlDataType(用于XML)之间定义映射即可。

这并非是标准的解决方案,但是相似度很高,如果你经常需要进行此类操作,则可以将其改造成一个“框架”供简单插入你自己的类型。

1

1

0
你手头有的是一个单一的“表格”(CSV文件),其中包含(可能)表示(可能)分层数据模型的非规范化行。你想将其映射到基于XSD的任意分层XML文档。
你需要一个工具,可以将分组关键列映射到XML元素,并指定哪些数据列放在哪些属性/子元素中。这是一个相当重要的问题,除非你的映射是微不足道的。
你能否发布一些CSV和XSD的样本?这可能有助于获得更专注的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接