Autor |
Beitrag |
Crusher87
Hält's aus hier
Beiträge: 3
|
Verfasst: Do 19.07.18 11:04
Hallo zusammen,
da ich langsam am verzweifeln bin, frag ich einfach nach Hilfe.
Ich möchte ein XML- Datei auslesen und in eine Listbox schreiben.
Leider erhalte ich den Fehler System.InvalidOperationException: "Fehler im XML-Dokument (2,2)."
Anbei meine Codes:
Zum schreiben:
Main Window:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| System.Xml.Serialization.XmlSerializer xmlserializer = new System.Xml.Serialization.XmlSerializer(typeof(List<Messwerte>)); List<Messwerte> listeMesswerte = new List<Messwerte>(); StreamWriter sw = new StreamWriter(filename_puffer); listeMesswerte.Add(new Messwerte { nummer = Convert.ToString(n), date = Convert.ToString(DateTime.Now), Messwert_H9_5 = Robi_.NumReg[51], Messwert_H11 = Robi_.NumReg[52], Messwert_H13_8 = Robi_.NumReg[53], Messwert_H16 = Robi_.NumReg[54], Messwert_H18 = Robi_.NumReg[55], Messwert_H20 = Robi_.NumReg[56], Messwert_H23_8 = Robi_.NumReg[57], Messwert_H28 = Robi_.NumReg[58], Messwert_H29 = Robi_.NumReg[59]}); xmlserializer.Serialize(sw, listeMesswerte); sw.Close(); |
Klasse:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:
| public class Messwerte { [XmlAttribute("Nummer")] public string nummer { get; set; }
[XmlElement("DatumZeit")] public string date { get; set; }
[XmlElement("Messwert_H9_5")] public string Messwert_H9_5 { get; set; }
[XmlElement("Messwert_H11")] public string Messwert_H11 { get; set; }
[XmlElement("Messwert_H13_8")] public string Messwert_H13_8 { get; set; }
[XmlElement("Messwert_H16")] public string Messwert_H16 { get; set; }
[XmlElement("Messwert_H18")] public string Messwert_H18 { get; set; }
[XmlElement("Messwert_H20")] public string Messwert_H20 { get; set; }
[XmlElement("Messwert_H23_8")] public string Messwert_H23_8 { get; set; }
[XmlElement("Messwert_H28")] public string Messwert_H28 { get; set; }
[XmlElement("Messwert_H29")] public string Messwert_H29 { get; set; } } |
XML-Datei (Bsp:)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54:
| <?xml version="1.0" encoding="UTF-8"?>
-<ArrayOfMesswerte xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-<Messwerte Nummer="1">
<DatumZeit>19.07.2018 11:35:36</DatumZeit>
<Messwert_H9_5>6</Messwert_H9_5>
<Messwert_H11>7,002096</Messwert_H11>
<Messwert_H13_8>7,0024</Messwert_H13_8>
<Messwert_H16>7,0024</Messwert_H16>
<Messwert_H18>7,002501</Messwert_H18>
<Messwert_H20>7,002501</Messwert_H20>
<Messwert_H23_8>7,001994</Messwert_H23_8>
<Messwert_H28>7,001994</Messwert_H28>
<Messwert_H29>7,095992</Messwert_H29>
</Messwerte>
-<Messwerte Nummer="2">
<DatumZeit>19.07.2018 11:36:36</DatumZeit>
<Messwert_H9_5>1</Messwert_H9_5>
<Messwert_H11>7,002096</Messwert_H11>
<Messwert_H13_8>7,0024</Messwert_H13_8>
<Messwert_H16>7,0024</Messwert_H16>
<Messwert_H18>7,002501</Messwert_H18>
<Messwert_H20>7,002501</Messwert_H20>
<Messwert_H23_8>7,001994</Messwert_H23_8>
<Messwert_H28>7,001994</Messwert_H28>
<Messwert_H29>7,095992</Messwert_H29>
</Messwerte>
</ArrayOfMesswerte> |
Zum Lesen:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| XmlSerializer xmlserializer = new XmlSerializer(typeof(List<Messwerte_>)); List<Messwerte_> listeMesswerte = new List<Messwerte_>(); datum_ = Convert.ToString(listBoxDatum.SelectedItem); StreamReader sr = new StreamReader("...\\Messwerte\\" + Ordner + "\\" + Maschine + "\\" + datum_ + "_Messwerte_" + Convert.ToString(listBoxTeile.SelectedItem) + "_P_" + ".xml"); listeMesswerte = (List<Messwerte_>)xmlserializer.Deserialize(sr); Anzahl_Messergebnisse = (listeMesswerte[listeMesswerte.Count - 1].nummer); labelAnzahl.Content = Anzahl_Messergebnisse; sr.Close();
foreach (Messwerte_ messwerte in listeMesswerte) { Nummer = messwerte.nummer; datum = messwerte.date.Remove(0, 11);
Messwert_13_9 = messwerte.Messwert_H9_5; Messwert_14_9 = messwerte.Messwert_H11; Messwert_15_9 = messwerte.Messwert_H13_8; Messwert_16_9 = messwerte.Messwert_H16;
Abstand();
listbox_Gesamttext = Nummer + Abstand_1 + datum + Abstand_2 + Messwert_13_9 + Abstand_2 + Messwert_14_9 + Abstand_2 + Messwert_15_9 + Abstand_2 + Messwert_16_9; listBoxMesswerte.Items.Add(listbox_Gesamttext); } |
Klasse:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:
| public class Messwerte_ { [XmlAttribute("Nummer")] public string nummer { get; set; }
[XmlElement("DatumZeit")] public string date { get; set; }
[XmlElement("Messwert_H9_5")] public string Messwert_H9_5 { get; set; }
[XmlElement("Messwert_H11")] public string Messwert_H11 { get; set; }
[XmlElement("Messwert_H13_8")] public string Messwert_H13_8 { get; set; }
[XmlElement("Messwert_H16")] public string Messwert_H16 { get; set; }
[XmlElement("Messwert_H18")] public string Messwert_H18 { get; set; }
[XmlElement("Messwert_H20")] public string Messwert_H20 { get; set; }
[XmlElement("Messwert_H23_8")] public string Messwert_H23_8 { get; set; }
[XmlElement("Messwert_H28")] public string Messwert_H28 { get; set; }
[XmlElement("Messwert_H29")] public string Messwert_H29 { get; set; } } |
Kann mir jemand helfen? Was mache ich falsch?
Danke im Voraus?
Moderiert von Th69: Titel geändert: "Serialisierung:" hinzugefügt
Moderiert von Mathematiker: Name aus Verzeichnis entfernt
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 19.07.18 11:24
Hallo und ,
warum hast du zwei verschiedene Klassen für die Messwerte?
Und sind die Minuszeichen am Anfang mancher Zeilen in der XML-Datei wirklich vorhanden oder nur hier im Forumsbeitrag?
PS: Und du solltest deinen Code besser strukturieren und das Serialisieren (Lesen, Schreiben) in eigene (Logik-)Klassen auslagern (Trennung von UI und Logik).
|
|
Crusher87
Hält's aus hier
Beiträge: 3
|
Verfasst: Do 19.07.18 12:04
Hallo,
es sind zwei Klassen, weil es 2 verschiedene Programme sind.
Das Programm zum Schreiben ist auf einem PC an einer Maschine.
Das Programm zum Lesen sollen alle über den Server können.
Die Minus-zeichen sind nur hier im Forumsbeitrag vorhanden.
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 19.07.18 13:54
Dann sollten aber auch beide Klassen gleich heißen bzw. bei den Klassen das gleiche XmlTypeAttribute angegeben sein (s.a. Attributes That Control XML Serialization) - evtl. auch noch XmlRootAttribute.
In der XML-Datei steht ja explizit ArrayOfMesswerte (und nicht ArrayOfMesswerte_).
Noch besser wäre es wohl, wenn die (eine) Klasse nur in genau einer Assembly definiert ist - und diese dann von beiden Projekten referenziert wird (und dann könnten dadrin dann auch beide Methoden zum Lesen und Speichern enthalten sein - mit entsprechenden Parametern).
|
|
Crusher87
Hält's aus hier
Beiträge: 3
|
Verfasst: Do 19.07.18 14:10
|
|
|