2009-08-05 11 views
6

J'essaie de désérialiser un fichier XML Atom généré par l'un des systèmes internes. Cependant, lorsque je tente:Comment désérialiser xml avec un espace de noms par défaut?

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

il jette une exception sur la définition de l'espace de noms:

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

Lorsque j'ajoute l'espace de noms au constructeur de XmlSerializer, mon objet est complètement vide:

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 
    } 

Des idées comment puis-je le faire fonctionner?

Répondre

10

Il est difficile d'étudier ceci sans être capable de regarder comment votre modèle d'objet est lié au xml (c'est-à-dire des échantillons de chacun); cependant, vous devriez être en mesure de faire quelque chose comme:

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

Comme exemple d'atome limité (qui fonctionne très bien avec un certain atome d'exemple que j'ai « à la main »):

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, fait le travail. – Grzenio

5

Vous peut déboguer le sérialisation XML en ajoutant ceci au app.config

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

dans votre dossier Temp, les fichiers C# pour le sérialiseur sont générés et vous pouvez ouvrir ces derniers dans VS pour le débogage.

Jetez aussi un coup d'œil au XmlNamespaceManager (même pour les espaces de noms par défaut).

Questions connexes