我需要使用SSIS将此XML文件中的记录插入到sql Server 2005表中.
我坚持使用xsd文件描述.在Visual Studio中,当我单击Generate XSD按钮时,我收到消息“无法从XML文件推断XSD .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>
SSIS有一个可以进行转换的XML任务.将XML任务添加到SSIS控制流并进行编辑.将OperationType属性值更改为XSLT,将SourceType更改为File连接,将Source更改为源文件中存在问题的源.
将SaveOperationResult属性设置为True并展开OperationResult分支.将DestinationType设置为File Connection,将Destination设置为新的XML文件.
<?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设置为File连接,将Second Operand设置为新的XSLT文件.
运行XML任务时,它将获取原始文件并应用XSLT文件中定义的转换规则.结果将保存在新的XML文件中.此任务只需要为原始XML文件运行一次.查看新文件时,您将看到与原始文件相同的数据,但没有命名空间引用.
现在,您可以返回到数据流并更改XML Source以引用新的XML文件.单击Generate XSD,您应该可以避免错误.
单击XML Source中的Columns选项卡时,您可能会看到警告.这是因为可能没有完全定义数据类型(例如,没有提到字符串长度).只要默认数据类型(255个字符的Unicode字符串)满足您的需要,这应该不是问题.
以下是两个可用于处理SSIS XML Task和XML Source对象的引用.这里有很好的资源XML,XSD和XSLT.