2009-08-05 8 views
6

Ich versuche, ein Atom XML zu deserialisieren, das von einem der internen Systeme erzeugt wird. Allerdings, wenn ich versuche:Wie kann ich XML mit einem Standardnamespace deserialisieren?

public static MyType FromXml(string xml) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(MyType)); 
     return (MyType) serializer.Deserialize(new StringReader(xml)); 
    } 

es eine Ausnahme von der Definition des Namespace wirft:

System.InvalidOperationException: <feed xmlns='http://www.w3.org/2005/Atom'> was not expected. 

Wenn ich den Namespace an den Konstruktor des XmlSerializer hinzufügen, mein Objekt ist vollständig leer:

public static MyType FromXml(string xml) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(MyType), "http://www.w3.org/2005/Atom"); 
     return (MyType) serializer.Deserialize(new StringReader(xml)); //this will return an empty object 
    } 

Irgendwelche Ideen wie kann ich es zur Arbeit bringen?

Antwort

10

Es ist schwierig, dies zu untersuchen, ohne in der Lage zu sein, zu sehen, wie Ihr Objektmodell an die xml (d. H. Proben von jedem) bindet; jedoch sollten Sie in der Lage sein, etwas zu tun:

[XmlRoot("feed", Namespace = "http://www.w3.org/2005/Atom")] 
public class MyType {...} 

Als begrenzte Atom Beispiel (die mit einigen Probenatom funktioniert gut I „zur Hand“ haben):

class Program 
{ 
    static void Main() 
    { 
     string xml = File.ReadAllText("feed.xml"); 
     XmlSerializer serializer = new XmlSerializer(typeof(MyType)); 
     var obj = (MyType)serializer.Deserialize(new StringReader(xml)); 
    } 
} 
[XmlRoot("feed", Namespace = "http://www.w3.org/2005/Atom")] 
public class MyType 
{ 
    [XmlElement("id")] 
    public string Id { get; set; } 
    [XmlElement("updated")] 
    public DateTime Updated { get; set; } 
    [XmlElement("title")] 
    public string Title { get; set; } 
} 
+0

Prost, hat den Job gemacht. – Grzenio

5

Sie können das Debuggen XML-Serialisierung durch diese an die app.config Zugabe

<system.diagnostics> 
    <switches> 
    <add name="XmlSerialization.Compilation" value="1" /> 
    </switches> 
</system.diagnostics> 

in Ihrem Temp-Ordner, C# Dateien für den Serializer generiert und Sie können diese in VS für das Debuggen öffnen.

Werfen Sie auch einen Blick auf die XmlNamespaceManager (auch für Standard-Namespaces).

Verwandte Themen