Hallo,
ich bin gerade dabei mir ein kleines Skript zu bauen welches mir ein XML-Response eines WebRequestes auswerten soll.
Allerdings bekomme ich beim Deserialisieren immer die Fehlermeldung:
Das Stammelement ist nicht vorhanden
Ich habe schon stundenlang versucht diesen Fehler zu beheben komme aber auf keine Lösung. Vielleicht habt ihr ja eine Idee.
mein Deserialisieren
XmlSerializer deserializer = new XmlSerializer(typeof(List<File>));
List<File> files = (List<File>)deserializer.Deserialize(dataStream);
dataStream.Close();
Class File
public class File
{
[XmlAttribute("filename")]
public string filename
{ get; set; }
[XmlAttribute("filestatus")]
public int filestatus
{ get; set; }
[XmlAttribute("filesize")]
public int filesize
{ get; set; }
}
XML
<data>
<status>1</status>
<folderKey>h2vw15yfhfyv236</folderKey>
<folderStatus>1</folderStatus>
<folderSize>203.1</folderSize>
<files>
<file>
<filename>bilder1.zip</filename>
<filestatus>1</filestatus>
<filesize>95</filesize>
</file>
<file>
<filename>bilder2.zip</filename>
<filestatus>1</filestatus>
<filesize>95</filesize>
</file>
</data>
vielen Dank wenn ihr mir helfen könnt! 😉
Vielleicht stören die ersten Elemente vor <files>? Für die gibts ja keine Entsprechung in deinen Klassen. Nimm die mal aus dem XML und schau obs dann geht.
Hallo nipec,
chilic hat recht. Du müsstest dir noch ne data machen.. ausserdem ist das glaube ich case sensitiv.. wobei ich mir aber nicht ganz sicher bin.
Aber nen kleiner tip beim studio ist ein Tool namens xsd.exe dabei, damit kann man sich für ein xml die passenden Klassen generieren lassen.
Grüße
Das Problem ist das ich die XML von einem Webservice geliefert bekomme.
Also müsste ich sie dann erst manuell umbauen. Gibt es keine einfache Möglichkeit der Klasse XmlSerializer mitzuteilen das sie diese Einträge ignorieren soll?
Aber wenn ich sie umbauen würde, ginge das dann so?
<data>
<status>1</status>
<folderKey>h2vw15yfhfyv236</folderKey>
<folderStatus>1</folderStatus>
<folderSize>203.1</folderSize>
</data>
<data>
<files>
<file>
<filename>bilder1.zip</filename>
<filestatus>1</filestatus>
<filesize>95</filesize>
</file>
<file>
<filename>bilder2.zip</filename>
<filestatus>1</filestatus>
<filesize>95</filesize>
</file>
</data>
das <files> element scheint auch nirgendwo zuzugehen.
MfG Paul
Kannst du die XML Daten nicht eigenständig lesen?
Per XMLReader ist das doch möglich und dann verarbeitest du die Daten selbst
Lesen von XML aus einer Datei
Edit:
</files> fehlt in der XML Datei
Du müsstest dir noch ne data machen.
+1. Du brauchst ein Containerobjekt, dass die File-Objekte enthält (wenn du den XML-Serializer verwenden möchtest).
Zudem sind filename/-status/-size keine XML-Attribute.
EDIT: Die Container-Variante sieht z.B. folgendermaßen aus:
[XmlRoot("data")]
public class DataContainer
{
[XmlElement("status")]
public int Status { get; set; }
[XmlElement("folderKey")]
public string FolderKey { get; set; }
[XmlElement("folderStatus")]
public int FolderStatus { get; set; }
[XmlElement("folderSize")]
public decimal FolderSize { get; set; }
[XmlArray("files")]
[XmlArrayItem("file")]
public File[] Files { get; set; }
}
[XmlRoot("file")]
public class File
{
[XmlElement("filename")]
public string Name { get; set; }
[XmlElement("filestatus")]
public int Status { get; set; }
[XmlElement("filesize")]
public int Size { get; set; }
}
string xml = @"<data><status>1</status><folderKey>h2vw15yfhfyv236</folderKey><folderStatus>1</folderStatus><folderSize>203.1</folderSize><files><file><filename>bilder1.zip</filename><filestatus>1</filestatus><filesize>95</filesize></file><file><filename>bilder2.zip</filename><filestatus>1</filestatus><filesize>95</filesize></file></files></data>";
using (StringReader stringReader = new StringReader(xml))
using (XmlReader xmlReader = XmlReader.Create(stringReader))
{
XmlSerializer serializer = new XmlSerializer(typeof(DataContainer));
DataContainer data = (DataContainer)serializer.Deserialize(xmlReader);
File[] files = data.Files;
}
Ich würd auch sagen, lies das Ding doch einfach selber aus. Das dauert nicht viel länger als Attribute auf Felder zu setzen und du hast die volle Kontrolle über das was passiert
Diese ganzen automatischen Hilfen sind schon schön, aber man gibt halt alles Wissen üer das was passiert und jeden Einfluss ab. Ich les mir mein XML gern selbst aus, dann hab ich später bei Änderungen kein Problem mehr, egal was genau sich ändert.
vielen Dank für die vielen Antworten! =)
Ich bin jetzt dank euch auch schon weiter gekommen würde es aber trotzdem erstmal noch mithilfe der Serialisierung weiter probieren.
So kurz vorm Ziel will man ja nicht das Handtuch werfen 😉 Das nächste mal werde ich es aber dann doch wohl selber machen.
Ich habe es jetzt mit dem Code von dN!3L probiert und auch verstanden das ich noch eine Data Klasse brauche allerdings sind die Werte von data.Files immer null auch wenn ich die XML wie in dem Beispiel konstant durch den String angebe.
Das verwirrt mich jetzt irgendwie. Ist dort noch irgendwo ein Fehler versteckt?
Ich habe es jetzt mit dem Code von dN!3L probiert und auch verstanden das ich noch eine Data Klasse brauche allerdings sind die Werte von data.Files immer null auch wenn ich die XML wie in dem Beispiel konstant durch den String angebe
Ich habe den Code nochmal eins zu eins zurück kopiert und er funktioniert einwandfrei.
Hast du irgendwas angepasst? Welche Framework-Version benutzt du?
Nein es lag an mir, Entschuldigung 😉 Es hatte sich ein Tippfehler eingeschlichen.
Jetzt funktioniert alles.
Vielen Dank für eure Hilfe 😃