Laden...

Deserialisiere XML Response

Erstellt von nipec vor 12 Jahren Letzter Beitrag vor 12 Jahren 4.942 Views
N
nipec Themenstarter:in
4 Beiträge seit 2011
vor 12 Jahren
Deserialisiere XML Response

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! 😉

C
2.121 Beiträge seit 2010
vor 12 Jahren

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.

849 Beiträge seit 2006
vor 12 Jahren

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

N
nipec Themenstarter:in
4 Beiträge seit 2011
vor 12 Jahren

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>

E
395 Beiträge seit 2007
vor 12 Jahren

das <files> element scheint auch nirgendwo zuzugehen.

MfG Paul

P
157 Beiträge seit 2010
vor 12 Jahren

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

2.891 Beiträge seit 2004
vor 12 Jahren

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;
}

C
2.121 Beiträge seit 2010
vor 12 Jahren

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.

N
nipec Themenstarter:in
4 Beiträge seit 2011
vor 12 Jahren

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?

2.891 Beiträge seit 2004
vor 12 Jahren

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?

N
nipec Themenstarter:in
4 Beiträge seit 2011
vor 12 Jahren

Nein es lag an mir, Entschuldigung 😉 Es hatte sich ein Tippfehler eingeschlichen.
Jetzt funktioniert alles.

Vielen Dank für eure Hilfe 😃