cod*_*000 5 xml xsd ssis sql-server-2005
我有XML(见下文).
我需要使用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>
Run Code Online (Sandbox Code Playgroud)
SSIS不处理XML源文件中的多个名称空间.您的文件包含名称空间,包括ACMEHdr,Msg,Pmt,TransResp等.您可以找到可以看到格式的示例<Namespace:Element>.避免多个名称空间的第一步是将源文件转换为不引用名称空间的格式.
SSIS有一个可以进行转换的XML任务.将XML任务添加到SSIS控制流并进行编辑.将OperationType属性值更改为XSLT,将SourceType更改为File连接,将Source更改为源文件中存在问题的源.
将SaveOperationResult属性设置为True并展开OperationResult分支.将DestinationType设置为File Connection,将Destination设置为新的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>
Run Code Online (Sandbox Code Playgroud)
此代码来自以下文章,该文章还提供了有关清理源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资源.
| 归档时间: |
|
| 查看次数: |
12507 次 |
| 最近记录: |