Ich habe einige "XML" -Dateien, die nicht ganz ein richtiges Schema haben (ich denke, das ist das Problem) gegeben und das medizinische Gerät, das sie erzeugt, kann nicht geändert werden generieren leicht zu parsen XML. (Bei einem solchen tantalizingly kleine Modifikation (extra Verpackung Bilder -Tags um das Bild Einträge) es wäre trivial sein, diese Dateien zu lesen --- ist nicht das, was XML geht?)Parsing etwas abstürzen XML in C# mit XmlSeralizer
Im Grunde bin ich hier stecken geblieben. Das XML sieht wie folgt aus:
<Series>
<Metadata1>foo</Metadata1>
<Metadata2>bar</Metadata2>
...
<Image>...</Image>
<Image>...</Image>
...
</Series>
(es kann eine beliebige Anzahl von Bildern, aber die möglichen Metadaten-Tags alle bekannt sind). Mein Code sieht wie folgt aus:
public class Image { ... }
public class Series : List<Image>
{
public Series() { }
public string Metadata1;
public string Metadata2;
...
}
Als ich das laufen wie folgt:
XmlSerializer xs = new XmlSerializer(typeof(Series));
StreamReader sr = new StreamReader(path);
Series series = (Series)xs.Deserialize(sr);
sr.Close();
die Liste der Bildobjekte liest richtig in die Serie Objekt aber nicht Metadata1/2/etc Felder gelesen werden (in Tatsächlich zeigt das Durchsuchen des Objekts im Debugger alle Metadatenfelder in einem "Raw View" -Sortierfeld.
Wenn ich den Code ändern:
public class Series // // removed this : List<Image>
{
public Series() { }
public string Metadata1;
public string Metadata2;
...
}
und führen den Leser auf die Datei, erhalte ich eine Serie Objekt mit Metadata1/2/etc. perfekt ausgefüllt, aber keine Bilddaten gelesen (offensichtlich).
Wie analysiere ich sowohl Metadata1/2/etc. und die Bilderserie mit der geringsten Menge an schmerzhaftem Ad-hoc-Code?
Muss ich eine benutzerdefinierte (schmerzhafte? Einfach?) ReadXML-Methode schreiben, um IXMLSeralizable zu implementieren?
Ich interessiere mich nicht zu sehr, wie die Objekte angeordnet sind, da meine Software, die diese C# -Klassen verwendet, völlig flexibel ist:
List<Image> Images;für die Bilder wäre in Ordnung, oder vielleicht sind die Metadaten in irgendein Objekt eingewickelt, was auch immer ..
Der einzige Teil, den ich brauchte, war: [XmlElement (ElementName = "Image")] public Image [] Images; und es hat wunderbar funktioniert. Die [XmlElement] -Attribute für die öffentliche Klasse Image {...} waren unnötig (und kompilieren nicht wirklich: "Attribut 'XmlElement' ist für diesen Deklarationstyp nicht gültig. Es ist gültig für 'property, indexer, field, param, return Nur Deklarationen. " –