Как взять XML-файл и вставить его значения в таблицу базы данных с помощью служб SSIS (SQL Server 2005) - PullRequest
5 голосов
/ 03 сентября 2010

У меня есть XML (см. Ниже).

Мне нужно вставить записи в этом XML-файле в таблицу SQL Server 2005 с помощью служб SSIS.

Я застрял с описанием файла xsd. В Visual Studio, когда я нажимаю кнопку «Создать XSD», я получаю сообщение «Невозможно вывести XSD из файла XML. XML содержит несколько пространств имен».

Кто-нибудь знает хороший ресурс или учебник, который может помочь мне решить эту проблему?

Обратите внимание, что мне нужно выполнить эту задачу в SSIS.

Спасибо

<?xml version="1.0" encoding="utf-8" ?> 
<Envelope>
    <Body>
        <Env>
            <ACMEHdr:ACMEResponseHdr xmlns:ACMEHdr="ACMEResponseHdr">
                <ACMEHdr:ProcessorName>ACME PREPAID SOLUTIONS</ACMEHdr:ProcessorName>
                <ACMEHdr:FeedName>ACMEPMTRSP</ACMEHdr:FeedName>
                <ACMEHdr:FileDate>08122010</ACMEHdr:FileDate>
                <ACMEHdr:WorkOfDate>08112010</ACMEHdr:WorkOfDate>
                <ACMEHdr:FileSeqNumber>000024</ACMEHdr:FileSeqNumber>
            </ACMEHdr:ACMEResponseHdr>
            <Msg:Message xmlns:Msg="Message">
                <Pmt:PaymentResponse xmlns:Pmt="PaymentResponse">
                    <Pmt:TransactionResponse xmlns:TransResp="TransactionResponse">
                        <TransResp:trnDate>0711201002:10:01.123456</TransResp:trnDate>
                        <TransResp:intTransactionRefId>131BE5E1-701A-42FA-AF8C-D2D38FDCC2EA</TransResp:intTransactionRefId>
                        <TransResp:transAmt>11.88</TransResp:transAmt>
                        <TransResp:strDebitCreditCode>DR</TransResp:strDebitCreditCode>
                        <TransResp:transCurrencyCd>840</TransResp:transCurrencyCd>
                        <TransResp:userID></TransResp:userID>
                        <TransResp:transAmtUSD>11.88</TransResp:transAmtUSD>
                        <TransResp:orderNbr>AM219003F700</TransResp:orderNbr>
                        <TransResp:ACHTransactionID></TransResp:ACHTransactionID>
                        <TransResp:fundSourceType>02</TransResp:fundSourceType>
                        <TransResp:sessionId>MondaySep12201022134314153720392</TransResp:sessionId>
                        <TransResp:requestToken>ACHMEN414d51204c50505741373838202020202421824b12246620</TransResp:requestToken>
                        <TransResp:authorizationCode>A98765</TransResp:authorizationCode>
                        <TransResp:reasonCode></TransResp:reasonCode>
                        <TransResp:reasonCodeDesc></TransResp:reasonCodeDesc>
                        <TransResp:addressMatch>Y</TransResp:addressMatch>
                        <TransResp:postalCdMatchInd>Y</TransResp:postalCdMatchInd>
                        <TransResp:SENbr>295176482889</TransResp:SENbr>
                        <TransResp:SEName>American Express PASS Card Fee</TransResp:SEName>
                        <TransResp:transResponse>A</TransResp:transResponse>
                    </Pmt:TransactionResponse>
                    <Pmt:TransactionResponse xmlns:TransResp="TransactionResponse">
                        <TransResp:trnDate>0711201002:15:01.123456</TransResp:trnDate>
                        <TransResp:intTransactionRefId>46233C40-3C33-4914-B447-B3E60BB04148</TransResp:intTransactionRefId>
                        <TransResp:transAmt>11.88</TransResp:transAmt>
                        <TransResp:strDebitCreditCode>DR</TransResp:strDebitCreditCode>
                        <TransResp:transCurrencyCd>840</TransResp:transCurrencyCd>
                        <TransResp:userID></TransResp:userID>
                        <TransResp:transAmtUSD>11.88</TransResp:transAmtUSD>
                        <TransResp:orderNbr>AM009003F701</TransResp:orderNbr>
                        <TransResp:ACHTransactionID>ACH1234567</TransResp:ACHTransactionID>
                        <TransResp:fundSourceType>05</TransResp:fundSourceType>
                        <TransResp:sessionId>MondayAug12201022134214123456789</TransResp:sessionId>
                        <TransResp:requestToken></TransResp:requestToken>
                        <TransResp:authorizationCode></TransResp:authorizationCode>
                        <TransResp:reasonCode></TransResp:reasonCode>
                        <TransResp:reasonCodeDesc></TransResp:reasonCodeDesc>
                        <TransResp:addressMatch></TransResp:addressMatch>
                        <TransResp:postalCdMatchInd></TransResp:postalCdMatchInd>
                        <TransResp:SENbr></TransResp:SENbr>
                        <TransResp:SEName></TransResp:SEName>
                        <TransResp:transResponse>A</TransResp:transResponse>
                    </Pmt:TransactionResponse>
                </Pmt:PaymentResponse>
            </Msg:Message>
            <ACMEFtr:ACMEResponseFooter xmlns:ACMEFtr="ACMEResponseFooter">
                <ACMEFtr:countDetail>2</ACMEFtr:countDetail>
                <ACMEFtr:countCreditDetail>0</ACMEFtr:countCreditDetail>
                <ACMEFtr:countDebitDetail>2</ACMEFtr:countDebitDetail>
                <ACMEFtr:hashTotalAmt>23.76</ACMEFtr:hashTotalAmt>
                <ACMEFtr:hashTotalCreditAmt>0.00</ACMEFtr:hashTotalCreditAmt>
                <ACMEFtr:hashTotalDebitAmt>23.76</ACMEFtr:hashTotalDebitAmt>
            </ACMEFtr:ACMEResponseFooter>
        </Env>
    </Body>
</Envelope>

Ответы [ 4 ]

9 голосов
/ 08 сентября 2010

Служба SSIS не обрабатывает несколько пространств имен в исходном файле XML. Ваш файл имеет пространства имен, которые включают ACMEHdr, Msg, Pmt, TransResp и т. Д. Вы можете найти примеры, где вы видите формат <Namespace:Element>. Первый шаг во избежание использования нескольких пространств имен - это преобразование исходного файла в формат, который не ссылается на пространства имен.

В SSIS есть задача XML, которая может выполнять преобразование. Добавьте задачу XML в поток управления служб SSIS и отредактируйте ее. Измените значение свойства OperationType на XSLT, SourceType - на подключение к файлу, а Source - на исходный файл, в котором возникла проблема.

Установите для свойства SaveOperationResult значение True и разверните ветку OperationResult. Установите для параметра DestinationType значение Подключение к файлу, а для пункта назначения - новый файл XML.

Добавьте следующее в новый файл и сохраните его с расширением xslt.

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0"         xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="no" />
  <xsl:template match="/|comment()|processing-instruction()">
    <xsl:copy>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@*|node()" />
    </xsl:element>
  </xsl:template>
  <xsl:template match="@*">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="." />
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

Этот код взят из следующей статьи, в которой также приведена дополнительная информация об очистке исходного XML-файла: http://www.drdobbs.com/windows/219700581

Вернувшись к задаче XML, установите для параметра SecondOperandType значение «Подключение к файлу», а для второго операнда - новый файл XSLT.

Когда вы запускаете задачу XML, она возьмет ваш исходный файл и применит правила преобразования, определенные в файле XSLT. Результаты будут сохранены в вашем новом XML-файле. Эту задачу нужно запустить только один раз для исходного файла XML. Когда вы посмотрите на новый файл, вы увидите те же данные, что и в оригинале, но без ссылок на пространства имен.

Теперь вы можете вернуться к потоку данных и изменить источник XML для ссылки на новый файл XML. Нажмите Generate XSD, и вы сможете избежать ошибки.

Когда вы нажмете на вкладку Столбцы в вашем XML-источнике, вы, вероятно, увидите предупреждение. Это связано с тем, что типы данных могут быть определены не полностью (например, нет упоминаний о длинах строк). Это не должно быть проблемой, если тип данных по умолчанию (255-символьная строка Юникода) соответствует вашим потребностям.

Вот две ссылки, которые можно использовать для работы с объектами SSIS XML Task и XML Source . А вот хорошие ресурсы для XML , XSD и XSLT .

2 голосов
/ 07 сентября 2010

Вот что я попробовал, и у меня это сработало:

  1. Я сохранил ваш xml как файл .xml.
  2. Я открыл его в Visual Studio 2008.
  3. На панели инструментов редактора Xml я нажал значок «создать схему».
  4. Это сгенерировало 5 файлов xsd.
  5. Я запустил xsd.exe file.xsd file2.xsd fileN.xsd / classes
  6. Это сгенерировало класс C #, который представляет схемы.
  7. Здесь вы можете использовать скрипт SSIS исходный компонент для десериализации ваш XML-файл в потоки данных и использовать другие задачи SSIS, чтобы сделать вставки в SQL.

Вот файл

2 голосов
/ 05 сентября 2010

Вы пытались загрузить необработанный XML в тип данных XML в таблице базы данных, а затем преобразовать данные в таблицы базы данных с помощью хранимых процедур ? Я обычно предпочитаю этот метод, чтобы я мог сохранить исходный код XML на случай, если что-то изменится в схеме, о которой я не знаю во время импорта, например, в исходную систему добавит новые узлы в файл. Если вы воспользуетесь этим подходом, вы можете использовать sp_xml_preparedocument и OPENXML для преобразования данных.

0 голосов
/ 10 апреля 2012

Поддержка пространств имен в SSIS была добавлена ​​начиная с версии 2012 года (в частности, в задаче XML).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...