Announcement

Collapse
No announcement yet.

Große Menge XML-Dateien in MSSQL-DB einlesen - Frage zur Schemadatei

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Martin Honnen
    replied
    Originally posted by Dimo Tabken View Post
    Moin in die Runde,
    ich bin "der Neue hier" und habe Euer Forum bei meinem Versuch gefunden, eine funktionierende Schema-Datei für den Import von ca. 1,5 Mio XML-Dateien in eine SQL-Datenbank zu erzeugen.
    Ich bin, was XML angeht, ein ziemlicher Neuling, speziell mit der Frage zu Schemas habe ich mich bisher nicht auseinandergesetzt, das wird sich nun ändern müssen.
    Zu meiner konkreten Herausforderung:

    Ich habe XML-Dateien, die alle den folgenden Aufbau haben:

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <Document ID="0000a\00d48436-7edc-45c1-ac56-8fe28bfd1f17">
    <Fields>
    <DocumentId Name="DocumentId" Type="System.String" Mandatory="false"><![CDATA[437445]]></DocumentId>
    </Fields>
    <Files>
    <File ID="0001" Name="IrgendEinDocName.doc" Size="55296" MimeType="application/octet-stream" IsEncrypted="false" />
    </Files>
    </Document>


    Wenn ich das Script nun mit einer Beispieldatei laufen lasse, erzeugt es mir in meiner Datenbank zwei leere Datensätze, die Felder haben jeweils den Wert NULL.
    Meine Tabelle DocMeta hat die fünf Spalten

    DocumentID,
    FileID,
    DocName,
    DocSize,
    MimeType

    Hat jedes XML-Dokument nur ein "Document"-Element? Wird jedes "Document"-Element genau in eine Zeile der SQL Tabelle eingetragen? Bulkupload dient ja in erster Linie dazu, aus einem XML-Dokument mit Tausenden oder Millionen von Daten diese in entsprechende Zeilen der SQL-Tabelle einzulesen, aber doch nicht, um 1,5 Millionen getrennte Dateien zu verarbeiten.

    Kannst du mal für das Beispiel angeben, welche Werte aus dem XML-Dokument in welche Spalte der Tabelle gehören? Werden manche Werte aus dem XML ignoriert bzw. nicht benötigt?

    Leave a comment:


  • Dimo Tabken
    replied
    Hi Christian!
    Dank Dir für Deine Antwort!
    Wenn ich dem SQLXMLBulkload bzw. dem vbscript Dein Schema mitgebe, bekomme ich die folgende Fehlermeldung:

    Code:
    Validation failed on meta.xml
    =======
    Reason: Gemäß dem DTD/Schema ist im Zusammenhang mit Element 'DocumentId' kein Text zugelassen.
    
    Source:     <DocumentId Name="DocumentId" Type="System.String" Mandatory="false"><![CDATA[437445]]></DocumentId>
    Habe jetzt nach etwas Suche etwas gefunden, wo ich mir aus meiner XML-Beispieldatei ein Schema erstellen lassen konnte. Das Schema wird auch bei der Validation akzeptiert,
    nun stehe ich aber vor der Herausforderung, die Verbindung zu meiner Datenbank herzustellen.
    Gelernt habe ich bisher, dass ich den xmlns sql mit einbinden muss, damit das überhaupt funktioniert.

    Was ich nachträglich eingefügt habe (Habe versucht, andere Beispiele gedanklich zu übertragen), markiere ich hier mal rot:


    Code:
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sql = "urn:schemas-microsoft-com:mapping-schema">
      <xs:element name="DocumentId">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:int">
              <xs:attribute type="xs:string" name="Name"/>
              <xs:attribute type="xs:string" name="Type"/>
              <xs:attribute type="xs:string" name="Mandatory"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element name="File">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute type="xs:byte" name="ID"/>
              <xs:attribute type="xs:string" name="Name" sql:field="DocName"/>
              <xs:attribute type="xs:int" name="Size" sql:field="DocSize"/>
              <xs:attribute type="xs:string" name="MimeType" sql:field="MimeType"/>
              <xs:attribute type="xs:string" name="IsEncrypted"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element name="Fields" sql:relation="DocMeta">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="DocumentId"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Files" sql:relation="DocMeta">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="File"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Document">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="Fields"/>
            <xs:element ref="Files"/>
          </xs:sequence>
          <xs:attribute type="xs:string" name="ID" sql:field="DocumentID"/>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    Das ist aber offensichtlich immer noch ziemlich falsch, denn ich bekomme nun die Meldung

    Code:
    meta1.vbs(17, 3) Schema mapping: Schema: relationship expected on 'Fields'
    Und nun bin ich mit meinem Latein endgültig am Ende.
    Hättest Du vielleicht nochmal einen Tipp für mich? Ich würde die Logik gerne verstehen, damit ich zukünftig nicht mehr ganz so doof dastehe ...

    Vielen Dank!



    Leave a comment:


  • Christian Marquardt
    replied
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
      <xs:element name="Document">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="Fields"/>
            <xs:element ref="Files"/>
          </xs:sequence>
          <xs:attribute name="ID" type="xs:string" use="required"/>
        </xs:complexType>
      </xs:element>
      <xs:element name="Fields">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="DocumentId"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="DocumentId">
        <xs:complexType>
          <xs:attribute name="Mandatory" type="xs:string" use="required"/>
          <xs:attribute name="Name" type="xs:string" use="required"/>
          <xs:attribute name="Type" type="xs:string" use="required"/>
        </xs:complexType>
      </xs:element>
      <xs:element name="Files">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="File"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="File">
        <xs:complexType>
          <xs:attribute name="ID" type="xs:string" use="required"/>
          <xs:attribute name="IsEncrypted" type="xs:string" use="required"/>
          <xs:attribute name="MimeType" type="xs:string" use="required"/>
          <xs:attribute name="Name" type="xs:string" use="required"/>
          <xs:attribute name="Size" type="xs:string" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:schema>

    Leave a comment:

Working...
X