我设计,其由多个在CSV文件的形式伙伴的接收数据的系统。该文件可能在数和列的顺序不同。在大多数情况下,我会想选择列的子集,也许重新排序,并把他们关到一个解析器。我显然更喜欢能够输入的数据转换成一些规范格式,以使解析器尽可能简单。

理想情况下,我想能够生成用于使用一些图形工具的每个输入数据格式的变换和变换为文档存储在数据库中或在磁盘上。在数据的receival,我会申请正确的转换(别提我如何确定正确的转换)的规范格式,以获得一个XML文档。如果传入文件已包含XML我只想创造了每种格式的XSLT文档,并在我的方式得到。

我用的BizTalk的平面文件XSLT扩展(或不管他们的称呼)在过去类似的东西,但我不希望的BizTalk的麻烦(我买不起,要么)在这个项目上。

有谁知道是否有替代技术和/或XSLT扩展,它使我能够实现一个优雅的方式我的目标是什么?

我正在开发的.NET 3.5 SP1我在C#应用程序(因此宁愿通过.NET支持的技术)。

有帮助吗?

解决方案

XSLT提供了新的功能,使其更易于解析非XML文件。

安德鲁韦尔奇发布 XSLT其将CSV成XML 2.0实例

其他提示

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

http://csv2xml.sourceforge.net

IIRC有人已经创建了一个“LINQ到CSV”库,可能是一个起点以创建中间XML(在存储器中)作为输入到所述变换。

找到它这里

您可以尝试LINQ到CSV。有一个从微软的马特Perdeck nofollow的noreferrer“>埃里克·怀特和另一名来自

寻找到一个类似的问题空间时,我已经发现2级潜在的解决方案。

Progress软件具有一组工具和API(.NET),其在与一起选择使用.conv时(平坦以XML转换器)在其铁笔工作室工具创建的文件允许任何预先定义的平面文件格式转变为XML在运行时。这里更多的信息: HTTP:// WWW。 datadirect.com/developer/data-integration/tutorials/converter-sample-code/index.ssp

在另外还有叫做XFLAT的XML格式,其允许的平面文件中的各种格式的描述中,分隔的,固定宽度等...有一个Java程序,这将转换的平面文件,在这里已经provied在XFLAT描述成XML,这样就可以继续使用标准的XML到XML XSLT转换。更多详细信息可以在这里找到: http://www.unidex.com/overview.htm

研究类似的问题时,我从来没有实际使用任何这些工具,但发现他们。

查核这篇文章上实现一个XmlReader那处理非XML输入。这不是一个得不得了艰巨的任务,一旦你得到它的工作,你不需要使用XSLT样的技术,你可以只使用XSLT。

此将解析从Linux的IP路由列表命令的输出。这只是我所奠定左右。

中,必须用所谓“输出”的元素,该样式表将它从那里从comman的输出。这里真正的关键是在XPath 2.0规范的令牌化命令。我不知道你怎么会在这之前做到这一点。另外这并不能使一个单一的根元素,因为这不是我需要它。在你的情况下,代替劈裂上的空间,标识spli上“”

<?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>

您还可以看看 Altova的MapForce的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top