XML in DataSet lesen



  • Hallo Forum,
    ich versuche eine .XML Datei in ein Dataset zu laden. Leider listet findet die ReadXml Methode nur das Attribut IdentNummer. Wie bekomme ich die komplette Datei gelesen? Habe schon ein Schema mit VisualStudio erstellt, ich weiß nicht ob ich das richtig eingebunden habe. Read Schema klappt leider nicht. Er findet dann nichts.

    ArtikelDataSet.ReadXml(openFileDialog1.FileName);
    dataGridView1.DataSource = ArtikelDataSet;
    dataGridView1.DataMember = "Artikel";
    

    Die XML sieht so aus:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <ArtikelDatenbank xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Artikeldb.xsd">
      <Artikel IdentNummer="10387">
        <Eintrag01 EAN-Code="8806085643796" />
        <Eintrag02 Hersteller="Samsung" />
        <Eintrag03 Artikelbezeichnung="Protective Cover + S4mini grün" />
        <Eintrag04 Kategorie="Zubehör, Telefon" />
        <Eintrag05 Lieferant="Fxy" />
        <Eintrag06 Warengruppe="WG1" />
        <Eintrag07 LetzterZugang="17.12.13" />
        <Eintrag08 Bestand="1" />
        <Eintrag09 EK="15,00" />
        <Eintrag10 VK="20,00" />
        <Eintrag11 Beschreibung="" />
      </Artikel>
    

    Danke für eure Tipps.



  • Für das DataSet muß die XML in einem bestimmten Format vorliegen.
    Wenn du eine bestehende XML-Datei (bzw. XSD) hast, dann verwende dafür entweder die beim VS mitgelieferte XSD.exe oder aber XSD2Code, um dessen Serialisierungsmethoden zu benutzen.



  • Danke TH69.
    Ich habe eine bestehende, alleinstehende .XML Datei. Ich habe diese mit VS geladen und im Menü XML ein Schema erstellt.
    Wie ich mittlerweile herausgefunden habe liest die Methode ReadXml die komplette Datei zwar ein, erstellt aber 12 Tables im DataSet. Dabei möchte ich alles in einer Table haben.

    Mit folgendem Code habe ich das getestet:

    for(int i = 0;i<ArtikelDataSet.Tables.Count;i++)
    {
        dataGridView1.DataMember = ArtikelDataSet.Tables[i].ToString();
        MessageBox.Show(ArtikelDataSet.Tables.ToString());
    }
    

    Mit dem Erscheinen der MessageBox ändert sich die erste Column des DataGridViews in den entsprechenden Eintrag.

    Ich versuche mich mal an XSD.exe.



  • Kann es sein das VS2015CommunityEd. kein XSD.exe beinhaltet?
    Ich habe einen XML Schema Explorer bei dem mir aufgefallen ist, dass das Attribut IdentNummer am Ende der Auflistung steht. Die erzeugte XSD sieht so aus:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="ArtikelDatenbank">
        <xs:complexType>
          <xs:sequence>
            <xs:element maxOccurs="unbounded" name="Artikel">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Eintrag01">
                    <xs:complexType>
                      <xs:attribute name="EAN-Code" type="xs:string" use="required" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="Eintrag02">
                    <xs:complexType>
                      <xs:attribute name="Hersteller" type="xs:string" use="required" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="Eintrag03">
                    <xs:complexType>
                      <xs:attribute name="Artikelbezeichnung" type="xs:string" use="required" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="Eintrag04">
                    <xs:complexType>
                      <xs:attribute name="Kategorie" type="xs:string" use="required" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="Eintrag05">
                    <xs:complexType>
                      <xs:attribute name="Lieferant" type="xs:string" use="required" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="Eintrag06">
                    <xs:complexType>
                      <xs:attribute name="Warengruppe" type="xs:string" use="required" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="Eintrag07">
                    <xs:complexType>
                      <xs:attribute name="LetzterZugang" type="xs:string" use="required" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="Eintrag08">
                    <xs:complexType>
                      <xs:attribute name="Bestand" type="xs:int" use="required" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="Eintrag09">
                    <xs:complexType>
                      <xs:attribute name="EK" type="xs:string" use="required" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="Eintrag10">
                    <xs:complexType>
                      <xs:attribute name="VK" type="xs:string" use="required" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="Eintrag11">
                    <xs:complexType>
                      <xs:attribute name="Beschreibung" type="xs:string" use="required" />
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
                <xs:attribute name="IdentNummer" type="xs:unsignedShort" use="required" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    Die Zeile die ich meine ist:

    <xs:attribute name="IdentNummer" type="xs:unsignedShort" 
    use="required" />
    

    Dennoch scheint die XSD korrekt zu sein. Ich habe im Designer die Möglichkeit eine Beispiel XML Datei nach dem Vorbild der XSD zu erstellen. Die verhält sich identisch und sieht genauso aus wie meine Ursprungsdatei.

    Muss ich die Datei manuell mit einem XML Reader einlesen?



  • Öffne mal extern "Developer Command Prompt" (im Untermenü "Visual Studio Tools" unter "Start"/"Alle Programme"/"Visual Studio 2015")

    Mittels

    xsd /c ...
    

    kannst du die benötigten Serialisierungsklassen erstellen lassen.

    s.a. XML Schema Definition Tool (Xsd.exe) oder XSD ( XSD tool / XSD.exe ) To generate .Net Class file

    Oder wie gesagt "XSD2Code" installieren - dann geht das direkt im Visual Studio Solution Explorer.



  • Habe das Schema jetzt mit XSD.exe erstellt. Wenn ich mir das im Designer ansehe, habe ich alle Einträge als einzelne Tabellen. Also das Gleiche in Grün. Ich kann da auch Relationen setzen, aber wie bekomme ich die Einträge 01 - 11 alle zusammen in das Objekt Artikel? Die gehören ja schließlich zusammen.



  • XSD2Code ist scheinbar nicht kompatibel mit VS2015.



  • Jeder XML-Tag ("ArtikelDatenbank", "Artikel", "Eintrag01", ...) wird als eine Klasse serialisiert.
    Wenn du das anders haben willst, dann mußt du entweder die XML ändern:

    <Artikel IdentNummer="10387"
        EAN-Code="8806085643796"
        Hersteller="Samsung"
        Artikelbezeichnung="Protective Cover + S4mini grün"
        Kategorie="Zubehör, Telefon"
        Lieferant="Fxy"
        Warengruppe="WG1"
        LetzterZugang="17.12.13"
        Bestand="1"
        EK="15,00"
        VK="20,00"
        Beschreibung=""
    />
    

    (also alles als Attribute eintragen) oder aber dann per Code ein Mapping durchführen.

    PS: Gut zu wissen, daß XSD2Code nicht mehr mit VS2015 funktioniert - z.Z. verwende ich es noch mit VS2013.



  • Hi Th69,

    Jeder XML-Tag ("ArtikelDatenbank", "Artikel", "Eintrag01", ...) wird als eine Klasse serialisiert.
    Wenn du das anders haben willst, dann mußt du entweder die XML ändern:

    Da ich noch weitere .XML Dateien mit ähnlichem Format einlesen möchte und diese bereits recht groß geworden sind (zwischen 10 und 15MB), kann ich das leider nicht von "Hand" machen. Gibt es ein Tool welches die gewünschten Elementknoten in Attribute wandeln kann?

    Ich denke mir bleibt nicht viel übrig.
    Kennst du eine Möglichkeit die einzelnen Table.Columns an ein neues DataSet zu übergeben? Oder ist es einfacher einen .XML Reader zu erzeugen und die Datei manuell in eine Generic.List einzulesen, um diese dann an ein DataSet zu übergeben? Vielleicht gibt es ja auch eine ganz simple Lösung 😕

    Danke.



  • Ein fertiges Tool fällt mir dafür nicht ein, jedoch wäre es (zumindest für dein oben gezeigtes Beispiel) nicht viel Magie.

    • Artikel-Knoten ermitteln
    • Alle Unterknoten durchgehen
    • Attribute der Unterknoten zu Attributen vom Artikelknoten hinzufügen
    • Unterknoten entfernen
    • Speichern

Anmelden zum Antworten