¿Puedo hacer que XmlSerializer ignore el espacio de nombres en la deserialización?

¿Puedo hacer que XmlSerializer ignore el espacio de nombres (atributo xmlns) en la deserialización para que no importe si el atributo se agrega o no, o incluso si el atributo es falso? Sé que la fuente siempre será confiable, así que no me importa el atributo xmlns.

Sí, puede decirle al XmlSerializer que ignore los espacios de nombres durante la deserialización.

Defina un XmlTextReader que ignora los espacios de nombres. Al igual que:

 // 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 () { } } 

Aquí hay un ejemplo de cómo se deserializaría usando ese 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 = @"   0 "; 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"); 

El resultado es así:

    0  

Si no espera espacio de nombres, pero la entrada tiene espacios de nombres, puede configurar

Namespaces = falso

en tu XmlTextReader.

Extendió la respuesta de Wolfgang Grinfeld (sin manejo de excepciones):

 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; } 

Resolvió esto utilizando XmlSerializer Deserialize para leer desde xml en lugar de stream. De esta forma, antes de que xml se deserialice, usando Regex para eliminar xsi: type del xml. Estaba haciendo esto es Biblioteca de clases portátil para Cross Platform, por lo que no tenía muchas otras opciones :(. Después de esto, la deserialización parece funcionar bien.

El siguiente código puede ayudar,

 public static TClass Deserialize(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; } 

Esto no ignora el espacio de nombres, sino que lo espera. Intentaba hacer lo mismo que tú, pero desde entonces he agregado la validación con un XSD y ahora se requiere el espacio de nombres. Así que aquí está lo que solía esperar un espacio de nombres. https://stackoverflow.com/a/7730989/1856992

¿Por qué intentar hacer que el XmlSerializer olvide cómo funciona XML? Es un hecho de XML que dos elementos con el mismo nombre pero diferentes espacios de nombres son elementos diferentes.

Si desea procesar XML que no tiene espacios de nombres, debe preprocesarlo para eliminar los espacios de nombres y luego pasarlo al serializador.