XML-Datein auslesen



  • Hallo zusammen und ein frohes neues Jahr.

    Ich habe folgendes Problem: Ich habe eine XML-Datei die ich auslesen möchte und in ein DataGridView anzeigen. Schreibe ich meinen Code nur in Form1 läuft auch alles wie es soll. Nun möchte ich es aber über eine Klasse XMLeinlesen als Funktionsaufruf auslesen. Doch irgendwie funktiniert es nicht. Die Rückgabedatei wird ist leer obwohl eigenlich da Daten nach dem auslesen drin sein sollten. Vielleicht kann mir jemand helfen.
    Mein Code:
    Aufbau des DataGridView in Form1

    #pragma region DataGridView
    
            /*** Spalten hinzufügen ***/
            DataGridViewTextBoxColumn ^spalte1 = gcnew DataGridViewTextBoxColumn();
            spalte1->Name = "TITEL";
            spalte1->HeaderText = "XYZ";
            dgvMesswerte->Columns->Add(spalte1);
    
            DataGridViewTextBoxColumn ^spalte2 = gcnew DataGridViewTextBoxColumn();
            spalte2->Name = "REGIE";
            spalte2->HeaderText = "XY";
            dgvMesswerte->Columns->Add(spalte2);
    #pragma endregion
    

    Aufbau der einlese Funktion eigene Klasse!

    List<CXml_Aufbau^>^ CDatei_lesen::XML_Datei_auswerten(String ^Speicherort)
    	{
    
    	   CXml_Aufbau ^temp = gcnew CXml_Aufbau();
    	   StreamReader ^sr = gcnew StreamReader(Speicherort);
    	   XmlSerializer ^xs = gcnew XmlSerializer(CXml_Aufbau::typeid);
    	   temp = (CXml_Aufbau^) xs->Deserialize(sr);
    	   sr->Close();
    		return temp->Messwerte; //Rückgabe funktioniert nicht!!??
    	}
    

    Aufbau der XML-Struktur eigene Klasse!

    [Serializable] 
    public ref class CXml_Aufbau
    {
    public:
        String ^Text1;
        String ^Text2;
        CXml_Aufbau();
        CXml_Aufbau(String ^, String ^);
        List<CXml_Aufbau^> ^Messwerte;
    };
    

    Aufruf der Funktion und weiterverarbeitung der Daten in Form1

    private: System::Void bt_speicherung_Messwerte_Click(System::Object^  sender, System::EventArgs^  e) 
    			 {
     CDatei_lesen^ fr = gcnew CDatei_lesen();
     CXml_Aufbau^ temp = gcnew CXml_Aufbau();
     fr->XML_Datei_auswerten("Test.xml");
     dgvMesswerte->Rows->Add();
     dgvMesswerte["TITEL", 0]->Value = "Hallo"; //Test wird im DatGridView angezeigt
     for (int i = 0; i < temp->Messwerte->Count; i++) //For-Schleife wird nicht ausgeführt da Messwerte->Count = 0 ist???
    {
     dgvMesswerte->Rows->Add();
     dgvMesswerte["TITEL", i]->Value = temp->Messwerte[i]->Text1;
     MessageBox::Show ("Ausgabe");
    }
    }
    


  • Hallo,

    du nutzt doch das zurück gegebene Objekt überhaupt nicht:

    fr->XML_Datei_auswerten("Test.xml");
    

    statt dessen erzeugst du oben mit:

    CXml_Aufbau^ temp = gcnew CXml_Aufbau();
    

    ein Objekt, das völlig "leer" ist, weswegen:

    temp->Messwerte->Count
    

    Null sein muss.

    MfG,

    Probe-Nutzer



  • Danke für den Hinweis.
    Nur habe ich jetzt immer noch nicht gelöst wie auf die ausgelesen Daten zugreifen kann. Da ich mit CDatei_lesen^ fr = gcnew CDatei_lesen(); nicht auf die ausgelesene temp-Datei zugreifen kann. Irgendwie muss ich doch die temp Datei zurückgeben können und damit in der Klasse Form in ein DataGrid einfügen.
    Möchte ich die temp Dateien einer normalen List oder nur Teile einem String übergeben will er dass nicht. Wie muss denn meine Klasse mit Funktionkopf aussehen
    damit es klappt?

    Nochmal die Struktur:
    Klasse
    Form1 = DataGrid

    Klasse
    XMLDateneinlesen Einfach nur öffnen der Datei und eingelesene Werte an den jeweiligen XmlAufbau übergeben.

    Klasse
    CXml_Aufbau Struktur der Daten



  • Funktioniert denn die Deserialisierung? Wenn ja, dann müsste doch:

    private: System::Void bt_speicherung_Messwerte_Click(System::Object^  sender, System::EventArgs^  e) 
                 {
     CDatei_lesen^ fr = gcnew CDatei_lesen();
    
     // hier temp eine Referenz zuweisen:
     List<CXml_Aufbau^>^ temp =  fr->XML_Datei_auswerten("Test.xml");
     dgvMesswerte->Rows->Add();
     dgvMesswerte["TITEL", 0]->Value = "Hallo"; //Test wird im DatGridView angezeigt
    
     // hier Count von temp auswerten
     for (int i = 0; i < temp.Count; i++) //For-Schleife wird nicht ausgeführt da Messwerte->Count = 0 ist???
       {
          dgvMesswerte->Rows->Add();
          dgvMesswerte["TITEL", i]->Value = temp->Messwerte[i]->Text1;
          MessageBox::Show ("Ausgabe");
       }
    }
    

    ein Ergebnis bringen?

    MfG,

    Probe-Nutzer



  • Danke Danke Probe-Nutzer.

    Mir fehlte diese Syntax: "List<CXml_Aufbau> temp = fr->XML_Datei_auswerten("Test.xml");"

    So nun nachmal das ganze Projekt für alle anderen die vor dem gleichen Problem stehen:
    Klasse Form1

    /*** Spalten hinzufügen ***/
            DataGridViewTextBoxColumn ^spalte1 = gcnew DataGridViewTextBoxColumn();
            spalte1->Name = "Messwert";
            spalte1->HeaderText = "sap";
            dgv_Messdaten->Columns->Add(spalte1);
    
            DataGridViewTextBoxColumn ^spalte2 = gcnew DataGridViewTextBoxColumn();
            spalte2->Name = "Messwert2";
            spalte2->HeaderText = "sa";
            dgv_Messdaten->Columns->Add(spalte2);
    

    Aufruf zum einlesen über einen Button

    System::Void bt_xml_einlesen_Click(System::Object^  sender, System::EventArgs^  e) 
    {
     //Datei einbinden
     CXML_einlesen^fr = gcnew CXML_einlesen();
     // Referenz zuweisen
     List<CXML_Struktur^>^temp = fr->XML_Datei_auswerten("Test.xml");
     for (int i = 0; i < temp->Count; i++) 
    {
     dgv_Messdaten->Rows->Add();
     dgv_Messdaten["Messwert", i]->Value = temp[i]->text1;
     dgv_Messdaten["Messwert2", i]->Value = temp[i]->text2;
    }
    

    Klasse XML einlesen Funktionsaufruf

    List<CXML_Struktur^>^ CXML_einlesen::XML_Datei_auswerten(String ^Speicherort)
    {
    
     CXML_Struktur ^temp = gcnew CXML_Struktur();
     StreamReader ^sr = gcnew StreamReader(Speicherort);
     XmlSerializer ^xs = gcnew XmlSerializer(CXML_Struktur::typeid);
     temp = (CXML_Struktur^) xs->Deserialize(sr);
     return temp->Messwerte; 
     sr->Close();
    }
    

    Klasse XML Struktur

    #pragma once
    namespace XML_Testumgebung {
    using namespace System;
    using namespace System::Collections::Generic;	
    
    [Serializable] 
    public ref class CXML_Struktur
    {
    public:
    
    	String^ text1;
    	String^ text2;
    	List<CXML_Struktur^> ^Messwerte;
    	CXML_Struktur();
    	CXML_Struktur(String^, String^);
    };
    }
    

    Funktionsaufruf der Klasse XML Struktur

    CXML_Struktur::CXML_Struktur()
    {
      this->text1 = "Bla";
      this->text2 = "HU";
      Messwerte = gcnew List<CXML_Struktur^>();
    }
    
    CXML_Struktur::CXML_Struktur(String ^text1, String ^text2)
    {
     this->text1 = text1;
     this->text2 = text2;
    }
    

    MFG
    Mister x


Anmelden zum Antworten