2011-02-04 39 views
5

Estoy buscando una manera rápida de deserializar xml, que tenga caracteres especiales en él como ö.forma rápida de deserializar XML con caracteres especiales

Estaba usando XMLReader y no puede deserializar dichos caracteres.

¿Alguna sugerencia?

EDITAR: Estoy usando C#. código es el siguiente:

XElement element =.. //has the xml 
XmlSerializer serializer = new XmlSerializer(typeof(MyType)); 
XmlReader reader = element.CreateReader(); 
Object o= serializer.Deserialize(reader); 
+0

Qué lenguaje/plataforma? ¿Qué codificación estás usando? ¿Puedes publicar tu código? – Oded

+0

deserialización? te refieres a analizar? para que idioma/propósito es? – BiAiB

+0

¿En qué contexto aparecen los caracteres? ¿Es realmente válido XML, o simplemente un XML-igual? –

Respuesta

8

Supongo que tiene un problema de codificación, no en el XMLReader pero con el XmlSerializer.

Puede usar la codificación XmlTextWriter y UTF8 con el XmlSerializer como en el siguiente fragmento (consulte los métodos genéricos a continuación para una implementación más agradable de la misma). Funciona perfectamente con diéresis (äöü) y otros caracteres especiales.

class Program 
{ 
    static void Main(string[] args) 
    { 
     SpecialCharacters specialCharacters = new SpecialCharacters { Umlaute = "äüö" }; 

     // serialize object to xml 

     MemoryStream memoryStreamSerialize = new MemoryStream(); 
     XmlSerializer xmlSerializerSerialize = new XmlSerializer(typeof(SpecialCharacters)); 
     XmlTextWriter xmlTextWriterSerialize = new XmlTextWriter(memoryStreamSerialize, Encoding.UTF8); 

     xmlSerializerSerialize.Serialize(xmlTextWriterSerialize, specialCharacters); 
     memoryStreamSerialize = (MemoryStream)xmlTextWriterSerialize.BaseStream; 

     // converts a byte array of unicode values (UTF-8 enabled) to a string 
     UTF8Encoding encodingSerialize = new UTF8Encoding(); 
     string serializedXml = encodingSerialize.GetString(memoryStreamSerialize.ToArray()); 

     xmlTextWriterSerialize.Close(); 
     memoryStreamSerialize.Close(); 
     memoryStreamSerialize.Dispose(); 

     // deserialize xml to object 

     // converts a string to a UTF-8 byte array. 
     UTF8Encoding encodingDeserialize = new UTF8Encoding(); 
     byte[] byteArray = encodingDeserialize.GetBytes(serializedXml); 

     using (MemoryStream memoryStreamDeserialize = new MemoryStream(byteArray)) 
     { 
      XmlSerializer xmlSerializerDeserialize = new XmlSerializer(typeof(SpecialCharacters)); 
      XmlTextWriter xmlTextWriterDeserialize = new XmlTextWriter(memoryStreamDeserialize, Encoding.UTF8); 

      SpecialCharacters deserializedObject = (SpecialCharacters)xmlSerializerDeserialize.Deserialize(xmlTextWriterDeserialize.BaseStream); 
     } 
    } 
} 

[Serializable] 
public class SpecialCharacters 
{ 
    public string Umlaute { get; set; } 
} 

yo personalmente utilizar los métodos genéricos siguientes aparatos para serializar y deserializar XML y objetos y no han tenido ningún problema de rendimiento o de codificación todavía.

public static string SerializeObjectToXml<T>(T obj) 
{ 
    MemoryStream memoryStream = new MemoryStream(); 
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 
    XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 

    xmlSerializer.Serialize(xmlTextWriter, obj); 
    memoryStream = (MemoryStream)xmlTextWriter.BaseStream; 

    string xmlString = ByteArrayToStringUtf8(memoryStream.ToArray()); 

    xmlTextWriter.Close(); 
    memoryStream.Close(); 
    memoryStream.Dispose(); 

    return xmlString; 
} 

public static T DeserializeXmlToObject<T>(string xml) 
{ 
    using (MemoryStream memoryStream = new MemoryStream(StringToByteArrayUtf8(xml))) 
    { 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 

     using (StreamReader xmlStreamReader = new StreamReader(memoryStream, Encoding.UTF8)) 
     { 
      return (T)xmlSerializer.Deserialize(xmlStreamReader); 
     } 
    } 
} 

public static string ByteArrayToStringUtf8(byte[] value) 
{ 
    UTF8Encoding encoding = new UTF8Encoding(); 
    return encoding.GetString(value); 
} 

public static byte[] StringToByteArrayUtf8(string value) 
{ 
    UTF8Encoding encoding = new UTF8Encoding(); 
    return encoding.GetBytes(value); 
} 
+1

Hmm. Envolver una secuencia en un XmlTextWriter y luego pasar el escritor.BaseStream parece que podría pasar la secuencia sin el XmlTextWriter. Especialmente porque Deserialize quiere un XmlReader, no un escritor, si vas a seguir esa ruta. –

+0

@JesseChisholm Tienes razón, eso tiene mucho sentido. También encontré la implementación con 'StreamReader' un par de tics más rápido. –

0
[XmlElement(ElementName = "Profiles")] 
    //public ProfilesType[] Profiles { get; set; } 
    public Profiles Profiles { get; set; } 

intentado algo más arriba?

No lo he comprobado, pero esto me vino a la mente. Me las arreglé para de + serializar los datos que tienen åäö etc. U no están hablando de nombres de etiquetas?

+0

¿Cómo ayudará esto ... Lo siento, no te entendí! – genericuser

+0

Me gusta , luego ElementName = "årtal" –

+0

Lamentablemente, årtal está causando la excepción. –

1

Lo que funciona para mí es similar a lo que @ Martin-Buberl sugerido:

public static T DeserializeXmlToObject<T>(string xml) 
{ 
    using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml))) 
    { 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 
     StreamReader reader = new StreamReader(memoryStream, Encoding.UTF8); 
     return (T)xmlSerializer.Deserialize(reader); 
    } 
} 
Cuestiones relacionadas