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 = DataGridKlasse
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