2009-08-05 16 views
6

Sto tentando di deserializzare un xml Atom generato da uno dei sistemi interni. Tuttavia, quando provo:Come posso deserializzare xml con uno spazio dei nomi predefinito?

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

viene generata un'eccezione sulla definizione dello spazio dei nomi:

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

Quando aggiungo lo spazio dei nomi al costruttore del XmlSerializer, il mio scopo è completamente vuota:

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 
    } 

Qualche idea come posso farlo funzionare?

risposta

10

È difficile indagare su questo senza essere in grado di esaminare il legame tra il modello dell'oggetto e l'xml (ovvero i campioni di ciascuno); tuttavia, si dovrebbe essere in grado di fare qualcosa di simile:

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

Come esempio atomo di limitata (che funziona bene con qualche atomo di esempio ho "a portata di mano"):

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

Cheers, ha fatto il lavoro. – Grzenio

5

Si può eseguire il debug del serializzazione XML aggiungendo questo al app.config

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

nella cartella temporanea, i file C# per il serializzatore sono generati ed è possibile aprire questi in VS per il debug.

Dai anche un'occhiata allo XmlNamespaceManager (anche per gli spazi dei nomi predefiniti).

Problemi correlati