1

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

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

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

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

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

4

8 回答 8

1

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

Andrew Welch 发布了一个将 CSV 转换为 XML 的 XSLT 2.0 示例

于 2008-11-25T00:02:36.023 回答
0

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

http://csv2xml.sourceforge.net

于 2008-11-24T19:09:59.653 回答
0

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

在这里找到它。

于 2009-02-17T14:30:32.623 回答
0

在研究类似的问题空间时,我发现了 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 格式,它允许以各种格式、分隔、固定宽度等描述平面文件......转换为 XML,以便您可以继续进行标准 XML 到 XML XSLT 的转换。更多细节可以在这里找到:http ://www.unidex.com/overview.htm

我从未真正使用过这些工具中的任何一个,但在研究类似问题时发现了它们。

于 2009-10-05T19:47:49.687 回答
0

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

于 2009-10-06T03:31:54.097 回答
0

查看这篇关于实现XmlReader处理非 XML 输入的文章。这不是一个非常困难的任务,一旦你让它工作,你就不需要使用类似 XSLT 的技术,你可以使用 XSLT。

于 2009-10-07T17:32:37.983 回答
0

这将解析 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>

于 2010-07-29T20:27:06.760 回答
-1

你也可以看看altova 的 MapForce

于 2008-11-24T20:10:56.863 回答