Tutorial :Can I make XmlSerializer ignore the namespace on deserialization?


Can I make XmlSerializer ignore the namespace (xmlns attribute) on deserialization so that it doesn't matter if the attribute is added or not or even if the attribute is bogus? I know that the source will always be trusted so I don't care about the xmlns attribute.


Yes, you can tell the XmlSerializer to ignore namespaces during de-serialization.

Define an XmlTextReader that ignores namespaces. Like so:

// helper class to ignore namespaces when de-serializing  public class NamespaceIgnorantXmlTextReader : XmlTextReader  {      public NamespaceIgnorantXmlTextReader(System.IO.TextReader reader): base(reader) { }        public override string NamespaceURI      {          get { return ""; }      }  }    // helper class to omit XML decl at start of document when serializing  public class XTWFND  : XmlTextWriter {      public XTWFND (System.IO.TextWriter w) : base(w) { Formatting= System.Xml.Formatting.Indented;}      public override void WriteStartDocument () { }  }  

Here's an example of how you would de-serialize using that TextReader:

public class MyType1   {      public string Label      {          set {  _Label= value; }           get { return _Label; }       }        private int _Epoch;      public int Epoch      {          set {  _Epoch= value; }           get { return _Epoch; }       }          }            String RawXml_WithNamespaces = @"        <MyType1 xmlns='urn:booboo-dee-doo'>          <Label>This document has namespaces on its elements</Label>          <Epoch xmlns='urn:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>0</Epoch>        </MyType1>";          System.IO.StringReader sr;      sr= new System.IO.StringReader(RawXml_WithNamespaces);      var o1= (MyType1) s1.Deserialize(new NamespaceIgnorantXmlTextReader(sr));      System.Console.WriteLine("\n\nDe-serialized, then serialized again:\n");      s1.Serialize(new XTWFND(System.Console.Out), o1, ns);      Console.WriteLine("\n\n");  

The result is like so:

    <MyType1>        <Label>This document has namespaces on its elements</Label>        <Epoch>0</Epoch>      </MyType1>  


If you expect no namespace, but the input has namespaces, then you can set

Namespaces = false

on your XmlTextReader.


Exdended Wolfgang Grinfeld answer (w/o exception handling):

public static Message Convert(XmlDocument doc)  {      Message obj;      using (TextReader textReader = new StringReader(doc.OuterXml))      {          using (XmlTextReader reader = new XmlTextReader(textReader))          {              reader.Namespaces = false;              XmlSerializer serializer = new XmlSerializer(typeof(Message));              obj = (Message)serializer.Deserialize(reader);          }      }        return obj;  }  


Solved this by using XmlSerializer Deserialize to read from xml instead from stream. This way before xml is Deserialized, using Regex to remove xsi:type from the xml. Was doing this is Portable Class Library for Cross Platform, so did not had many other options :(. After this the deserialization seems to work fine.

Following code can help,

public static TClass Deserialize<TClass>(string xml) where TClass : class, new()  {      var tClass = new TClass();        xml = RemoveTypeTagFromXml(xml);        var xmlSerializer = new XmlSerializer(typeof(TClass));      using (TextReader textReader = new StringReader(xml))      {          tClass = (TClass)xmlSerializer.Deserialize(textReader);      }      return tClass;  }    public static string RemoveTypeTagFromXml(string xml)  {      if (!string.IsNullOrEmpty(xml) && xml.Contains("xsi:type"))      {          xml = Regex.Replace(xml, @"\s+xsi:type=""\w+""", "");      }      return xml;  }  


This does not ignore the namespace but instead expects it. I was attempting to do the same thing you were, but I've since added in validation using an XSD and the namespace is now required. So here is what I used to expect a namespace. https://stackoverflow.com/a/7730989/1856992


Why try to make the XmlSerializer forget how XML works? It's a fact of XML that two elements with the same name but different namespaces are different elements.

If you want to process XML that has no namespaces, then you should pre-process it to remove the namespaces, and then pass it to the serializer.

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »