Comment prenez-vous un fichier XML et d'insérer ses valeurs dans une table de base de données à l'aide de SSIS (SQL Server 2005)
J'ai XML (voir ci-dessous).
J'ai besoin d'insérer les enregistrements de ce fichier XML dans SQL Server 2005 table à l'aide de SSIS.
Je suis coincé avec le fichier xsd de la description. Dans Visual Studio, quand je clique sur la génération XSD bouton je reçois le message "Impossible de déduire le XSD à partir du fichier XML. Le XML contient plusieurs espaces de noms."
Personne ne sait d'une bonne ressource ou un tutoriel qui peut m'aider soft ce problème?
Veuillez noter que j'ai besoin d'effectuer cette tâche dans SSIS.
Grâce
<?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>
- Voulez-vous ensuite l'insérer l'ensemble des données xml dans une colonne dans une table, ou voulez-vous sélectionner certaines parties du XML et de les mettre dans des colonnes différentes?
- J'ai besoin de faire un peu plus de la transformation sur les données à la SSIS niveau. Mais c'est l'étape je suis actuellement bloqué sur.
Vous devez vous connecter pour publier un commentaire.
SSIS ne pas gérer plusieurs espaces de noms dans le fichier source XML. Votre fichier possède des espaces de noms qui incluent ACMEHdr, Msg, Pmt, TransResp, etc. Vous pouvez trouver des exemples où vous pouvez voir le format
<Namespace:Element>
. La première étape pour éviter de multiples espaces de noms est de transformer votre fichier source dans un format qui ne fait pas référence à des espaces de noms.SSIS a une tâche XML qui peut faire la transformation. Ajouter la tâche XML à un Flux de Contrôle SSIS et de le modifier. Changement de l'operation type. la valeur de la propriété pour XSLT, SourceType de Fichier de connexion et la Source de votre fichier source qui a le problème.
Définir la SaveOperationResult True à la propriété et d'élargir le OperationResult branche. Ensemble DestinationType de Connexion de Fichier et la Destination d'un nouveau fichier XML.
Ajouter le texte suivant dans un nouveau fichier et l'enregistrer avec l'extension de fichier xslt.
Ce code provient de l'article suivant, qui donne aussi plus d'informations sur le nettoyage d'une source XML du fichier: http://www.drdobbs.com/windows/219700581
De retour dans le XML tâche, définissez la SecondOperandType de Fichier de connexion et le Second Opérande de votre nouveau fichier XSLT.
Lorsque vous exécutez la tâche XML, il prendra votre fichier d'origine et d'appliquer les règles de transformation définie dans le fichier XSLT. Les résultats seront enregistrés dans votre nouveau fichier XML. Cette tâche ne doit être exécutée une fois pour le fichier XML d'origine. Quand vous regardez le nouveau fichier, vous verrez les mêmes données que dans l'original, mais sans références d'espace de noms.
Maintenant, vous pouvez retourner à votre flux de données et de modifier le Source XML pour référencer le nouveau fichier XML. Cliquez sur Générer XSD et vous devriez être en mesure d'éviter que votre erreur.
Lorsque vous cliquez sur l'onglet Colonnes dans votre Source XML, vous verrez probablement un avertissement. C'est parce que les types de données peuvent ne pas être entièrement défini (par exemple il n'y a pas mention de la longueur de chaîne). Cela ne devrait pas être un problème tant que le type de données par défaut (255 caractères Unicode string) répond à vos besoins.
Voici deux références que vous pouvez utiliser pour travailler avec SSIS Tâche XML et Source XML objets. Et ici sont de bonnes ressources pour XML, XSD et XSLT.
Avez-vous essayé de charger le XML brut, dans un type de données XML dans une table de base de données et puis la conversion des données dans des tables de base de données, via des procédures stockées? En général, je préfère cette méthode pour que je puisse conserver l'original du code XML dans le cas où quelque chose change dans le schéma que je ne suis pas au courant au moment de l'importation, comme la source du système de l'ajout de nouveaux nœuds dans le fichier. Si vous allez avec cette approche, vous pourriez utiliser sp_xml_preparedocument et OPENXML pour convertir les données.
Voici ce que j'ai essayé et cela a fonctionné pour moi:
"créer un schéma de" l'icône.
représente le schémas.
composant source de sérialiser
votre fichier xml dans les flux de données et l'utilisation
d'autres SSIS tâches à faire les inserts
en SQL.
Voici le fichier
Le soutien pour les espaces de noms dans SSIS a été ajouté à partir de la version 2012 (dans la Tâche XML pour être précis).