2009-08-05 16 views
6

Estoy tratando de deserializar un átomo xml generado por uno de los sistemas internos. Sin embargo, cuando intento:¿Cómo puedo deserializar xml con un espacio de nombres predeterminado?

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

lanza una excepción en la definición del espacio de nombres:

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

Al agregar el espacio de nombres al constructor de XmlSerializer, mi objetivo es completamente vacío:

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 
    } 

¿Alguna idea de cómo puedo hacer que funcione?

Respuesta

10

Es difícil investigar esto sin poder ver cómo se relaciona su modelo de objeto con el xml (es decir, muestras de cada uno); Sin embargo, usted debe ser capaz de hacer algo como:

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

Como ejemplo átomo limitada (que funciona bien con algún átomo muestra Tengo "a 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

Saludos, hizo el trabajo. – Grzenio

5

Usted puede depurar el serialización XML mediante la adición de esto a la app.config

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

en su temp-carpeta, C# archivos para el serializador se generan y se puede abrir estos en VS para la depuración.

También eche un vistazo a XmlNamespaceManager (incluso para espacios de nombres predeterminados).

Cuestiones relacionadas