Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I deserialize xml with a default namespace?

I am trying to deserialize an Atom xml generated by one of the internal systems. However, when I try:

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

it throws an exception on the definition of the namespace:

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

When I add the namespace to the constructor of the XmlSerializer, my object is completely empty:

    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
    }

Any ideas how can I get it to work?

like image 663
Grzenio Avatar asked Aug 05 '09 10:08

Grzenio


2 Answers

It is hard to investigate this without being able to look at how your object model ties to the xml (i.e. samples of each); however, you should be able to do something like:

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

As a limited atom example (which works fine with some sample atom I have "to hand"):

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; }
}
like image 115
Marc Gravell Avatar answered Sep 21 '22 13:09

Marc Gravell


You may debug the XML serialization by adding this to the app.config

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

In your temp-folder, C# files for the serializer are generated and you can open up these in VS for debugging.

Also have a look at the XmlNamespaceManager (even for default namespaces).

like image 22
Scoregraphic Avatar answered Sep 19 '22 13:09

Scoregraphic