2011-02-04 15 views
5

Sto cercando un modo rapido per deserializzare xml, che contiene caratteri speciali come ö.metodo rapido per deserializzare XML con caratteri speciali

Stavo usando XMLReader e non riesce a deserializzare tali caratteri.

Qualche suggerimento?

MODIFICA: sto usando C#. codice è il seguente:

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

Che lingua/piattaforma? Quale codifica stai usando? Puoi pubblicare il tuo codice? – Oded

+0

deserializzazione? intendi parsing? per quale lingua/scopo è? – BiAiB

+0

In quale contesto appaiono i caratteri? È in realtà un XML valido, o solo un XML allo stesso modo? –

risposta

8

direi che stai avendo un problema di codifica, non in XMLReader ma con la XmlSerializer.

È possibile utilizzare la codifica XmlTextWriter e UTF8 con lo XmlSerializer come nel seguente frammento (vedere i metodi generici di seguito per una migliore implementazione di esso). Funziona perfettamente con dieresi (äöü) e altri caratteri speciali .

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

Io personalmente uso i metodi generici follwing per serializzare e deserializzare XML e oggetti e non hanno ancora avuto problemi di prestazioni o di codifica.

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. Avvolgere un flusso in un XmlTextWriter e poi passare a writer.BaseStream sembra che tu possa semplicemente passare lo stream senza XmlTextWriter. Soprattutto perché Deserialize vuole un XmlReader, non uno scrittore, se hai intenzione di percorrere quella strada. –

+0

@JesseChisholm Hai ragione, questo ha perfettamente senso. Ho anche trovato l'implementazione con 'StreamReader' un paio di volte più veloci. –

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

provato qualcosa di cui sopra?

Non ho controllato, ma questo mi è venuto in mente. Sono riuscito a de + serializzare i dati che hanno åäö ecc. U non stanno parlando di tagnames?

+0

come sarà questo aiuto .. Mi dispiace non averti preso! – genericuser

+0

Mi piace , quindi ElementName = "årtal" –

+0

Purtroppo, årtal causa l'eccezione. –

1

Ciò che funziona per me è simile a quello che @ martin-Buberl suggerito:

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