Преобразование плоского файла в XML с использованием XSLT-подобной технологии

Я разрабатываю систему, которая получает данные от ряда партнеров в виде файлов CSV. Файлы могут отличаться количеством и порядком столбцов. По большей части я хочу выбрать подмножество столбцов, возможно, переупорядочить их и передать синтаксическому анализатору. Я, очевидно, предпочел бы иметь возможность преобразовывать входящие данные в некоторый канонический формат, чтобы сделать синтаксический анализатор как можно более простым.

В идеале я хотел бы иметь возможность генерировать преобразование для каждого формата входящих данных с помощью какого-либо графического инструмента и сохранять преобразование как документ в базе данных или на диске. После получения данных я применил бы правильное преобразование (не говоря уже о том, как я определяю правильное преобразование), чтобы получить XML-документ в каноническом формате. Если бы входящие файлы содержали XML, я бы просто создал XSLT-документ для каждого формата и пошел бы дальше.

В прошлом я использовал XSLT-расширения плоских файлов BizTalk (или как они там назывались) для чего-то подобного, но мне не нужны хлопоты с BizTalk (и я тоже не могу себе этого позволить) в этом проекте.

Кто-нибудь знает, есть ли альтернативные технологии и / или расширения XSLT, которые позволят мне элегантно достичь моей цели?

Я разрабатываю свое приложение на C # на .NET 3.5 SP1 (поэтому предпочел бы технологии, поддерживаемые .NET).


person Rune    schedule 24.11.2008    source источник


Ответы (8)


XSLT предоставляет новые функции, которые упрощают анализ файлов в формате, отличном от XML.

Эндрю Велч опубликовал пример XSLT 2.0, конвертирует CSV в XML

person Mads Hansen    schedule 25.11.2008

Я думаю, вам нужно что-то вроде этого (извините, не поддерживается .NET, но код очень простой)

http://csv2xml.sourceforge.net

person Dmitry Khalatov    schedule 24.11.2008

Кто-то из IIRC создал библиотеку «LINQ to CSV», которая может быть отправной точкой для создания промежуточного XML (в памяти) в качестве входных данных для преобразования.

Нашел его здесь.

person Richard    schedule 17.02.2009

Вы можете попробовать LINQ to CSV. Есть одно предложение от Microsoft Эрик Уайт и еще один от Мэтта Пердека. Есть другие ...

person rasx    schedule 06.10.2009

Изучая аналогичное проблемное пространство, я нашел 2 возможных решения.

Progress Software имеет набор инструментов и API (.Net), которые при использовании в сочетании с файлами .conv (конвертер плоских файлов в XML), созданными в их инструменте Stylus Studio, позволяют преобразовывать любой предопределенный формат плоских файлов в XML при запуске. время. Дополнительная информация здесь: http://www.datadirect.com/developer/data-integration/tutorials/converter-sample-code/index.ssp

Кроме того, существует XML-формат под названием XFLAT, который позволяет описывать плоские файлы в различных форматах, с разделителями, фиксированной шириной и т. Д. Существует java-программа, которая конвертирует плоские файлы, где вы доказали описание XFLAT. в XML, чтобы можно было продолжить стандартное преобразование XML в XML XSLT. Более подробную информацию можно найти здесь: http://www.unidex.com/overview.htm

Я никогда не использовал ни один из этих инструментов, но нашел их при исследовании аналогичной проблемы.

person Stimy    schedule 05.10.2009

Ознакомьтесь с этой статьей о реализации XmlReader, обрабатывающего ввод, отличный от XML. . Это не очень сложная задача, и как только она заработает, вам не нужно использовать XSLT-подобную технологию, вы можете просто использовать XSLT.

person Robert Rossney    schedule 07.10.2009

это проанализирует вывод команды linux ip route list. Это просто то, что у меня было повсюду.

вы должны заключить вывод команды в элемент под названием «output», и таблица стилей возьмет его оттуда. Настоящий ключ здесь - это команда tokenize в спецификации xpath 2.0. Я не знаю, как ты мог это сделать до этого. Кроме того, при этом не создается ни одного корневого элемента, поскольку он мне не нужен. В вашем случае вместо разделения на пробел Id 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>

person Jeremiah Jahn    schedule 29.07.2010

Вы также можете ознакомиться с MapForce от altova

person Aaron Fischer    schedule 24.11.2008
comment
Altova MapForce хочет сгенерировать код для перехода от плоского файла к файлу XML. Он не делает этого только с помощью XSLT. - person Stimy; 30.09.2009