Laden...

XmlSerializer, Objekt wird nicht deserialisiert

Erstellt von Viperos vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.097 Views
V
Viperos Themenstarter:in
12 Beiträge seit 2017
vor 5 Jahren
XmlSerializer, Objekt wird nicht deserialisiert

Hallo,

versuche mich gerade an der Deserialisierung eines XML-Objektes.

Allerdings stelle ich fest das dies nicht ganz so einfach ist.

Folgendes Beispiel:

var xml1 = "<?xml version=\"1.0\"?><s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"></s:Envelope>";
            var xml2 = "<?xml version=\"1.0\"?><Envelope xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"></Envelope>";
            using (var xmlReader = new StringReader(xml2))
            {
                var xmlSerializer = new XmlSerializer(typeof(FaultEnvelope), "http://schemas.xmlsoap.org/soap/envelope/");
                var test = xmlSerializer.Deserialize(xmlReader);
            }

[XmlType("Envelope", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
    [XmlRoot("Envelope", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
    public class FaultEnvelope
    {
        [XmlAttribute("encodingStyle")]
        public string EncodingStyle { get; set; }
    }

Deserialisiere ich das Objekt mit xml2 funktioniert es tadellos.
Deserialisiere ich hingegen mit xml1 ist das deserialisierte Objekt nicht mit Daten befüllt.
EncodingStyle bleibt NULL.
Das ganze muss aber mit xml1 funktionieren. Ich vermute mal dass das was mit den Namespaces zutun hat.
Wobei ich der Meinung bin dass dies beides die selben Klassen sein sollten.

Was mache ich hier falsch?

Vielen Dank

2.207 Beiträge seit 2011
vor 5 Jahren

Hallo Viperos,

ich habe jetzt einfach mal https://xmltocsharp.azurewebsites.net/ angeschmissen mit

<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"></s:Envelope>

und dein Code für xml1 sollte laut dem Tool so aussehen:

using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace Xml2CSharp
{
	[XmlRoot(ElementName="Envelope", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
	public class Envelope {
		[XmlAttribute(AttributeName="s", Namespace="http://www.w3.org/2000/xmlns/")]
		public string S { get; set; }
		[XmlAttribute(AttributeName="encodingStyle", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
		public string EncodingStyle { get; set; }
	}

}

Gruss

Coffeebean

656 Beiträge seit 2008
vor 5 Jahren

XML-Attribute sind standardmäßig nicht in Namespaces, wenn man es im jeweiligen XML-Schema nicht explizit als solches deklariert.
Deine beiden XML-Fragmente sind nicht äquivalent, in beiden Fällen müsste es encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" heißen (ohne Namespace!)
Damit sollte hoffentlich auch klar sein, warum sich die beiden Fragmente nicht gleich verhalten.

Wenn der Namespace jedoch erfoderlich ist, musst dus auch beim XmlAttribute dazu schreiben (wie Coffeebean schon gepostet hat) - denn die Namespaces in den Serialisierungs-Attributen vererben sich nicht.