Pergunta

Eu estou projetando um sistema que está a receber dados a partir de um número de parceiros na forma de arquivos CSV. Os arquivos podem diferir no número e ordenação de colunas. Para a maior parte, vou querer escolher um subconjunto das colunas, talvez reordená-las e entregá-las a um analisador. Eu, obviamente, prefere ser capaz de transformar os dados de entrada em algum formato canônico de modo a tornar o analisador o mais simples possível.

Idealmente, eu gostaria de ser capaz de gerar uma transformação para cada formato de dados de entrada usando alguma ferramenta gráfica e armazenar a transformação como um documento em um banco de dados ou no disco. Mediante recebimento de dados, gostaria de aplicar a transformação correta (não importa como eu determinar a transformação correta) para obter um documento XML em um formato canônico. Se os arquivos de entrada continha XML Gostaria apenas de ter criado um documento XSLT para cada formato e foi no meu caminho.

Eu usei arquivo plano do BizTalk extensões XSLT (ou o que eles são chamados) para algo semelhante no passado, mas não quer o incômodo de BizTalk (e eu não posso pagar isso também) neste projeto.

Alguém sabe se existem tecnologias alternativas e / ou extensões XSLT que me permitam alcançar meu objetivo de uma forma elegante?

Estou desenvolvendo meu aplicativo em C # no .NET 3.5 SP1 (assim preferir tecnologias suportadas pelo .NET).

Foi útil?

Solução

XSLT fornece novos recursos que tornam mais fácil para analisar arquivos não-XML.

Andrew Welch registrou um XSLT 2.0 exemplo que converte CSV para XML

Outras dicas

Eu acho que você precisa de algo como isso (desculpe, não é suportado pelo .NET mas o código é muito simples)

http://csv2xml.sourceforge.net

IIRC alguém criou uma "LINQ to CSV" biblioteca que pode ser um ponto de partida para criar o XML intermediário (em memória) como entrada para a transformação.

aqui .

Você pode tentar LINQ to CSV. Há uma oferta de Microsoft Eric White e outro de Matt Perdeck . Outros estão lá fora ...

Eu encontrei 2 soluções possíveis quando se olha para um espaço problema semelhante.

Progress Software tem um conjunto de ferramentas e API (Net), que, quando usado em conjunto com .conv (flat para conversor de XML) arquivos criados em sua ferramenta Stylus Studio permite a transformação de qualquer formato de arquivo plano pré-definido em XML em tempo de execução. Mais informações aqui: http: // www. datadirect.com/developer/data-integration/tutorials/converter-sample-code/index.ssp ??

Além disso, há um formato XML chamado XFLAT que permite a descrição de arquivos simples em uma variedade de formatos, delimitado, fixo largura etc ... Existe um programa java que irá converter arquivos simples, onde você provied a descrição XFLAT em XML para que você possa continuar com um padrão XML para a transformação XSLT XML. Mais detalhes podem ser encontrados aqui: http://www.unidex.com/overview.htm

Eu nunca realmente usou qualquer uma destas ferramentas, mas os encontrou ao pesquisar um problema semelhante.

Confira este artigo na aplicação de um XmlReader que processos não -xml entrada. Não é uma tarefa terrivelmente difícil, e uma vez que você tem que trabalhar, você não precisa usar um XSLT-como tecnologia, você pode apenas usar XSLT.

isso irá analisar a saída do ip route comando list linux. É apenas o que eu tinha, que ao redor.

Você deve envolver a saída do comman em um elemento chamado 'saída' e a folha de estilo vai levá-la de lá. A chave real aqui é o comando tokenize no 2.0 especificação XPath. Eu não sei como você poderia fazer isso antes disso. Também isso não faz um único elemento raiz, como que não era o que eu precisava para isso. No seu caso, em vez spliting no espaço, spli Id em um ''

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

Você também pode dar uma olhada em de Altova MapForce

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top