Hallo liebe Community,ich möchte eine XML-Datei einlesen, die folgenden Inhalt hat:
Spoiler anzeigen
Um nach dem Einlesen einfacher auf den Inhalt zugreifen zu können habe ich dazu erstmal eine Klasse
Spoiler anzeigen
Diese Klasse soll quasi einen Knotenpunkt
Die Elemente, die im XML-Dokument so zu sagen unter dem XML-Pfad
Hier sollen Übersetzungstexte rein, weshalb die vorhandenen Sprachen eigentlich unbekannt sind und somit iteriert werden sollen.
Die gefundenen Sprachen sollen dann im zuvor instanzierten
Leider bekomme ich es einfach nicht auf die Reihe, alle Infos sauber auszulesen, ohne dass ich versehentlich einen Knoten überspringe.
Aktuell nutze ich den
Hier mein aktueller Versuch:
Spoiler anzeigen
Sobald ich das Element
Wie kann ich das bewerkstelligen?
BTW:
Die XML-Struktur habe ich mir selber "ausgedacht" und kann natürlich geändert werden, sofern mein Vorhaben mit der aktuellen Struktur gar nicht Sinnvoll wäre...
Vielen Dank für Eure Unterstützung!
HTML-Quellcode
- <?xml version="1.0" encoding="utf-8"?>
- <Messages>
- <Message ID="1">
- <Text>
- <DE>ABC</DE>
- <EN>ABC</EN>
- </Text>
- <ResetMode>0</ResetMode>
- <Action>0</Action>
- </Message>
- <Message ID="2">
- <Text>
- <DE>ABC</DE>
- <EN>ABC</EN>
- </Text>
- <ResetMode>0</ResetMode>
- <Action>0</Action>
- </Message>
- <Message ID="3">
- <Text>
- <DE>ABC</DE>
- <EN>ABC</EN>
- </Text>
- <ResetMode>0</ResetMode>
- <Action>0</Action>
- </Message>
- </Messages>
Um nach dem Einlesen einfacher auf den Inhalt zugreifen zu können habe ich dazu erstmal eine Klasse
Message
erstellt, welche folgende Eigenschaften besitzt:C#-Quellcode
- /// <summary>
- /// Ruft die ID ab, die der Meldung zugeordnet ist, oder legt diese fest.
- /// </summary>
- public string ID { get; set; }
- /// <summary>
- /// Ruft das Wörterbuch mit den anzuzeigenden Texten in unterschiedlichen Sprachen ab, oder legt dieses fest.
- /// </summary>
- public Dictionary<string, string> Text;
- /// <summary>
- /// Ruft ab, wie diese Meldung zu behandeln ist, oder legt dies fest.
- /// </summary>
- public int Action { get; set; }
- /// <summary>
- /// Ruft die Betriebsart ab, in der die Meldung zurückgesetzt werden kann, oder legt dies fest.
- /// Dies hat nur Auswirkungen auf Meldungen, dessen Action das Flag SysStop besitzt.
- /// </summary>
- public int ResetMode { get; set; }
Diese Klasse soll quasi einen Knotenpunkt
Message
repräsentieren.Die Elemente, die im XML-Dokument so zu sagen unter dem XML-Pfad
Messages/Message/Text
auftauchen (aktuell DE, EN) sind beliebig erweiterbar.Hier sollen Übersetzungstexte rein, weshalb die vorhandenen Sprachen eigentlich unbekannt sind und somit iteriert werden sollen.
Die gefundenen Sprachen sollen dann im zuvor instanzierten
Message-Object
der Dictionary hinzugefügt werden.Leider bekomme ich es einfach nicht auf die Reihe, alle Infos sauber auszulesen, ohne dass ich versehentlich einen Knoten überspringe.
Aktuell nutze ich den
XmlReader
zum Auslesen, da dieser schneller sein soll als andere Objekte und das XML-Dokument etwas größer werden kann (z.B. 500 Message-Einträge).Hier mein aktueller Versuch:
C#-Quellcode
- internal List<Message> ReadMessages(string path = "D:\\Test.xml")
- {
- var messageList = new List<Message>();
- using (var reader = XmlReader.Create( path))
- {
- try
- {
- // Haupt-Knoten für Meldungen öffnen
- reader.ReadStartElement("Messages");
- while (reader.Read())
- {
- // Meldungs-Knoten einlesen
- if ( reader.Name != "Message" && reader.NodeType != XmlNodeType.Element) continue;
- // Meldungs-ID einlesen
- var msgid = reader.GetAttribute("ID");
- // Meldungstexte einlesen
- reader.ReadStartElement("Text");
- var nodeType = reader.NodeType;
- //using (var innerReader = reader.ReadSubtree())
- //{
- // while (innerReader.Read())
- // {
- // var abc = reader.Name;
- // var value = reader.ReadElementContentAsString();
- // }
- //}
- }
- }
- catch (Exception ex) { throw ex; }
- }
- return messageList;
- }
Sobald ich das Element
Text
einlesen möchte, fliegt er mit einer Exception raus, weil das Element Text nicht gefunden wurde.Wie kann ich das bewerkstelligen?
BTW:
Die XML-Struktur habe ich mir selber "ausgedacht" und kann natürlich geändert werden, sofern mein Vorhaben mit der aktuellen Struktur gar nicht Sinnvoll wäre...
Vielen Dank für Eure Unterstützung!