【问题标题】:converting csv to xml with an xsd使用 xsd 将 csv 转换为 xml
【发布时间】:2009-11-04 16:17:33
【问题描述】:

我正在尝试找到一种可重用的方法来获取 CSV 文件并从中生成符合指定 XSD 的 XML 文件。我还没有真正找到一种可重用的方法。我使用了 Altova MapForce,它允许我导入 CSV 文件和 XSD,进行映射而不是从中生成代码,但是每当 XSD 更改时都需要重新生成代码。 Altova 也产生了大量的代码。

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

想法?这里有基于this 问题的XSLT 吗?

谢谢。

【问题讨论】:

  • 你考虑过使用 xkcd 吗?
  • 您还应该指定限制使用的 XSLT 版本(v1 还是 v2?) - 这对最佳答案有很大影响。此外,您是否仅限于一个供应商(哪一个?),还是需要独立于供应商/平台的解决方案?

标签: xml xslt csv xsd


【解决方案1】:

这似乎很容易做到,但事实并非如此。 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 模板。我可以看到一些我认为这将非常有用的领域!谢谢!
  • 我不同意这不是一件容易的事。这是一件容易的事。这是一个常见问题并且已经解决(对于 XSLT v2 用户)。
  • 当然,您可以通过架构,通过跳过可选元素并始终在有选择的时候选择第一个选项,您可以生成符合架构的文档。但是,如果除了 XML 模式包含的内容之外,还有其他元数据(例如 CSV 文件中的标题、将标题映射到元素名称的规则以及关于可选元素的约定),模式只能告诉您从 CSV 文件生成什么 XML 文档。没有它,不仅不容易,而且不可能。
【解决方案2】:

好吧,我真的没有现成的、开箱即用的解决方案,但也许:

  • 使用 FileHelphers 之类的库读取 CSV 文件;为此,您需要创建一个类 MyDataType 来描述 CSV 中的列,然后您将获得一个 MyDataType 数组

  • 1234563到您的 XML 架构
  • 或者如果这不起作用,您可以创建另一个映射到您的 XML 需求的类(从您拥有的 XSD 生成它),并且只需定义两种类型之间的映射 MyDataType(来自您的 CSV)和 MyXmlDataType(用于您的 XML)与 AutoMapper 之类的内容

它不是样板 - 但相当接近,您可以将其制作成一个“框架”,只需插入您自己的类型(如果您需要经常这样做)。

【讨论】:

    【解决方案3】:

    如果您的 XSLT 引擎与 XSLT 版本 2 兼容,那么最佳解决方案就在这里:

    【讨论】:

      【解决方案4】:

      Microsoft Excel 能够导出 XML:http://office.microsoft.com/en-us/excel-help/export-xml-data-HP010206401.aspx

      我在创建可导出的 XSD 格式时遇到了一些问题,但是一旦你开始使用它,它就会是一个非常棒的工具。

      【讨论】:

        【解决方案5】:

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

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

        您能否发布一些 CSV 和 XSD 的示例?这可能有助于获得更集中的答案。

        【讨论】:

          猜你喜欢
          • 2010-10-27
          • 1970-01-01
          • 2014-02-22
          • 2019-02-02
          • 1970-01-01
          • 2017-05-23
          • 2011-10-28
          相关资源
          最近更新 更多