代码之家  ›  专栏  ›  技术社区  ›  codingguy3000

如何使用SSIS(SQLServer2005)获取XML文件并将其值插入到数据库表中

  •  5
  • codingguy3000  · 技术社区  · 15 年前

    我有XML(见下文)。

    我需要使用SSIS将此XML文件中的记录插入到SQLServer2005表中。

    有谁知道一个好的资源或教程,可以帮助我软这个问题?

    请注意,我需要在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 回复  |  直到 15 年前
        1
  •  9
  •   bobs    15 年前

    SSIS不处理XML源文件中的多个命名空间。文件的名称空间包括ACMEHdr、Msg、Pmt、TransResp等。您可以在其中找到看到格式的示例 <Namespace:Element> . 避免多个名称空间的第一步是将源文件转换为不引用名称空间的格式。

    SSIS有一个XML任务可以完成转换。将XML任务添加到SSIS控制流并对其进行编辑。将OperationType属性值更改为XSLT、SourceType到文件连接以及Source到有问题的源文件。

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

    http://www.drdobbs.com/windows/219700581

    当您运行XML任务时,它将获取原始文件并应用XSLT文件中定义的转换规则。结果将保存在新的XML文件中。对于原始XML文件,此任务只需运行一次。查看新文件时,将看到与原始文件中相同的数据,但没有命名空间引用。

    XML Task XML Source XML , XSD XSLT

        2
  •  2
  •   Registered User    15 年前

    您是否尝试过将原始XML加载到数据库表中的XML数据类型中,然后 converting the data into database tables via stored procedures sp_xml_preparedocument OPENXML

        3
  •  2
  •   unclepaul84    15 年前

    以下是我尝试过的并且对我有效的方法:

    1. 我在visualstudio2008中打开了它。
    2. 在Xml编辑器工具栏上单击 “创建架构”图标。
    3. 这生成了5个xsd文件。
    4. 我跑了 xsd.exe文件文件.xsd文件2.xsd文件名.xsd/班级
    5. This generated a C# class that represents the schemas.
    6. 从这里你可以使用 SSIS script source component 反序列化 将xml文件转换为数据流并使用 执行插入的其他SSIS任务 转换为SQL。

    Here is the file

        4
  •  0
  •   Arthur    14 年前

    SSIS中对名称空间的支持从2012版开始添加(具体在XML任务中)。

    推荐文章