【问题标题】:Transforming flat file to XML using XSLT-like technology使用类似 XSLT 的技术将平面文件转换为 XML
【发布时间】:2008-11-24 18:57:42
【问题描述】:

我正在设计一个系统,它以 CSV 文件的形式接收来自多个合作伙伴的数据。这些文件的列数和顺序可能不同。在大多数情况下,我会想要选择列的一个子集,也许对它们重新排序,然后将它们交给解析器。我显然更希望能够将传入的数据转换为某种规范格式,以使解析器尽可能简单。

理想情况下,我希望能够使用一些图形工具为每种传入的数据格式生成转换,并将转换作为文档存储在数据库或磁盘上。收到数据后,我将应用正确的转换(不管我如何确定正确的转换)来获得规范格式的 XML 文档。如果传入的文件包含 XML,我会为每种格式创建一个 XSLT 文档,然后就可以了。

我过去曾使用过 BizTalk 的平面文件 XSLT 扩展(或它们所称的任何东西)来处理类似的事情,但我不想在这个项目上遇到 BizTalk 的麻烦(我也买不起)。

有谁知道是否有替代技术和/或 XSLT 扩展可以让我以优雅的方式实现我的目标?

我正在.NET 3.5 SP1 上用 C# 开发我的应用程序(因此更喜欢 .NET 支持的技术)。

【问题讨论】:

    标签: c# .net xml xslt flat-file


    【解决方案1】:

    XSLT 提供了一些新功能,可以更轻松地解析非 XML 文件。

    Andrew Welch 发布了 XSLT 2.0 example that converts CSV into XML

    【讨论】:

      【解决方案2】:

      我认为你需要这样的东西(对不起,.NET 不支持但代码很简单)

      http://csv2xml.sourceforge.net

      【讨论】:

        【解决方案3】:

        IIRC 有人创建了一个“LINQ to CSV”库,这可能是创建中间 XML(在内存中)作为转换输入的起点。

        找到它here

        【讨论】:

          【解决方案4】:

          您可以尝试使用 LINQ to CSV。 Microsoft 的Eric White 提供了一种产品,Matt Perdeck 提供了另一种产品。其他人在外面......

          【讨论】:

            【解决方案5】:

            在研究类似的问题空间时,我发现了 2 个潜在的解决方案。

            Progress Software 有一组工具和 API (.Net),当与在其 Stylus Studio 工具中创建的 .conv(平面到 XML 转换器)文件结合使用时,可以将任何预定义的平面文件格式转换为运行时的 XML。更多信息在这里:http://www.datadirect.com/developer/data-integration/tutorials/converter-sample-code/index.ssp

            此外,还有一种称为 XFLAT 的 XML 格式,它允许以各种格式、分隔、固定宽度等描述平面文件...有一个 java 程序可以转换平面文件,您已经提供了将 XFLAT 描述转换为 XML,以便您可以继续进行标准 XML 到 XML XSLT 的转换。更多细节可以在这里找到:http://www.unidex.com/overview.htm

            我从未真正使用过这两种工具,但在研究类似问题时发现了它们。

            【讨论】:

              【解决方案6】:

              查看this article,了解如何实现处理非 XML 输入的XmlReader。这不是一项非常困难的任务,一旦你完成了它,你就不需要使用类似 XSLT 的技术,你可以使用 XSLT。

              【讨论】:

                【解决方案7】:

                这将解析 linux ip route list 命令的输出。这正是我所放置的。

                您必须将命令的输出包装在一个名为“输出”的元素中,样式表将从那里获取它。这里真正的关键是 xpath 2.0 规范中的 tokenize 命令。我不知道在那之前你怎么能做到这一点。此外,这不会产生单个根元素,因为这不是我需要的。在你的情况下,而不是分割空间,Id spli on a ','

                <?xml version="1.0" encoding="UTF-8"?>
                

                <xsl:output method="xml" indent="yes" />
                
                <xsl:template match="@*|node()">
                    <xsl:copy>
                        <xsl:apply-templates select="@*|node()" />
                    </xsl:copy>
                </xsl:template>
                
                <xsl:template match="//output">
                    <!-- split things up for each new line -->
                    <xsl:variable name="line" select="tokenize(.,'\n')"/>
                    <xsl:for-each select="$line">                        
                        <!-- split each line into peices based on space -->
                        <xsl:variable name="split" select="tokenize(.,' +')"/>
                        <xsl:if test="count($split) &gt; 1">
                            <xsl:element name="route">                                        
                                <xsl:for-each select="$split">
                                    <xsl:choose>
                                        <xsl:when test="position() = 1">
                                            <xsl:attribute name="address" select="."/>
                                        </xsl:when>
                                        <xsl:otherwise>
                                            <xsl:variable name="index" select="position()"/>
                                            <xsl:variable name="fieldName" select="."/>
                                            <xsl:if test="$fieldName and position() mod 2 = 0">
                                                <xsl:attribute name="{$fieldName}" select="$split[$index + 1]"/>
                                            </xsl:if>
                                        </xsl:otherwise>
                                    </xsl:choose>
                                </xsl:for-each>
                            </xsl:element>
                        </xsl:if>
                    </xsl:for-each>
                </xsl:template>
                

                【讨论】:

                  【解决方案8】:

                  你也可以看看altova's MapForce

                  【讨论】:

                  • Altova MapForce 想要生成从平面文件到 XML 文件的代码。它不是纯粹用 XSLT 来做的。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-04-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-04-11
                  • 1970-01-01
                  相关资源
                  最近更新 更多