3 votes

problèmes d'importation de ssis pour mapper certaines données dans des fichiers xml

J'ai besoin d'importer des données à partir d'un fichier XML en utilisant un package SSIS vers SQL Server mais lorsque je génère le fichier xsd (à partir de SSIS) certaines données nécessaires dans le fichier XML ne sont pas mappées comme une colonne à la sortie :

print from xml source editor

Voici un modèle très similaire de fichier xml que j'utilise :

Il est nécessaire d'importer les données de la ligne 2 (DocumentID, ExportID, JobID, RunID, CreationTime, StartTime, EndTime).

Voici comment le fichier XSD est généré à partir de SSIS :

<?xml version="1.0"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:com:ssn:schema:export:SSNExportFormat.xsd">
  <xsd:element name="SSNExportDocument">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element minOccurs="0" name="MeterData">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element minOccurs="0" name="RegisterData">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element minOccurs="0" name="RegisterRead">
                      <xsd:complexType>
                        <xsd:sequence>
                          <xsd:element minOccurs="0" name="Tier">
                            <xsd:complexType>
                              <xsd:sequence>
                                <xsd:element minOccurs="0" maxOccurs="unbounded" name="Register">
                                  <xsd:complexType>
                                    <xsd:attribute name="Number" type="xsd:unsignedShort" use="optional" />
                                    <xsd:attribute name="Summation" type="xsd:decimal" use="optional" />
                                    <xsd:attribute name="SummationUOM" type="xsd:string" use="optional" />
                                    <xsd:attribute name="CumulativeDemand" type="xsd:decimal" use="optional" />
                                    <xsd:attribute name="MaximumDemand" type="xsd:decimal" use="optional" />
                                    <xsd:attribute name="MaximumDemandTime" type="xsd:dateTime" use="optional" />
                                    <xsd:attribute name="DemandUOM" type="xsd:string" use="optional" />
                                  </xsd:complexType>
                                </xsd:element>
                              </xsd:sequence>
                              <xsd:attribute name="Number" type="xsd:unsignedByte" use="optional" />
                            </xsd:complexType>
                          </xsd:element>
                        </xsd:sequence>
                        <xsd:attribute name="ReadTime" type="xsd:dateTime" use="optional" />
                        <xsd:attribute name="GatewayCollectedTime" type="xsd:dateTime" use="optional" />
                        <xsd:attribute name="RegisterReadSource" type="xsd:string" use="optional" />
                        <xsd:attribute name="Season" type="xsd:unsignedByte" use="optional" />
                      </xsd:complexType>
                    </xsd:element>
                  </xsd:sequence>
                  <xsd:attribute name="StartTime" type="xsd:dateTime" use="optional" />
                  <xsd:attribute name="EndTime" type="xsd:dateTime" use="optional" />
                  <xsd:attribute name="NumberReads" type="xsd:unsignedByte" use="optional" />
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
            <xsd:attribute name="MeterName" type="xsd:unsignedInt" use="optional" />
            <xsd:attribute name="UtilDeviceID" type="xsd:string" use="optional" />
            <xsd:attribute name="MacID" type="xsd:string" use="optional" />
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
      <xsd:attribute name="Version" type="xsd:decimal" use="optional" />
      <xsd:attribute name="DocumentID" type="xsd:string" use="optional" />
      <xsd:attribute name="ExportID" type="xsd:string" use="optional" />
      <xsd:attribute name="JobID" type="xsd:unsignedByte" use="optional" />
      <xsd:attribute name="RunID" type="xsd:unsignedByte" use="optional" />
      <xsd:attribute name="CreationTime" type="xsd:dateTime" use="optional" />
      <xsd:attribute name="StartTime" type="xsd:dateTime" use="optional" />
      <xsd:attribute name="EndTime" type="xsd:dateTime" use="optional" />
    </xsd:complexType>
  </xsd:element>
</xs:schema>

Je suis novice en matière de SSIS et de tâches XML et je vous serais reconnaissant de m'aider ! Merci...

1voto

Hadi Points 16319

Je ne pense pas que vous puissiez y parvenir en utilisant une XML Source vous devez ajouter un composant script (comme source), ouvrir l'éditeur du composant script, ajouter les colonnes de sortie dont vous avez besoin (DocumentID, ExportID, JobID, RunID, CreationTime, StartTime, EndTime).

enter image description here

Ensuite, ouvrez l'éditeur script et écrivez le code suivant (j'ai utilisé VB.NET) :

Vous devez remplacer "C:\MyPath\xmlfile.xml" avec le chemin du fichier xml, vous devez également ajouter System.Xml.Linq dll comme référence

Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports System.Xml
Imports System.Xml.Linq

<Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute>
<CLSCompliant(False)>
Public Class ScriptMain
    Inherits UserComponent

    Public Overrides Sub CreateNewOutputRows()

        Dim strFilePath As String = "C:\MyPath\xmlfile.GetXmlNamespace"
        Dim xml As XDocument = XDocument.Load(strFilePath)

        Output0Buffer.AddRow()

        With Output0Buffer

            .DocumentID = If(xml.Root.Attribute("DocumentID") Is Nothing, "", xml.Root.Attribute("DocumentID").Value.ToString)
            .ExportID = If(xml.Root.Attribute("ExportID") Is Nothing, "", xml.Root.Attribute("ExportID").Value.ToString)
            .JobID = If(xml.Root.Attribute("JobID") Is Nothing, "", xml.Root.Attribute("JobID").Value.ToString)
            .RunID = If(xml.Root.Attribute("RunID") Is Nothing, "", xml.Root.Attribute("RunID").Value.ToString)
            .CreationTime = If(xml.Root.Attribute("CreationTime") Is Nothing, "", xml.Root.Attribute("CreationTime").Value.ToString)
            .StartTime = If(xml.Root.Attribute("StartTime") Is Nothing, "", xml.Root.Attribute("StartTime").Value.ToString)
            .EndTime = If(xml.Root.Attribute("EndTime") Is Nothing, "", xml.Root.Attribute("EndTime").Value.ToString)

        End With

    End Sub

End Class

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X