2011-02-04 3 views
5

Я ищу быстрый способ десериализации xml, в котором есть специальные символы, такие как ö.быстрый способ десериализации XML со специальными символами

Я использовал XMLReader, и он не смог десериализовать такие символы.

Любое предложение?

EDIT: Я использую C#. код выглядит следующим образом:

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

Какой язык/платформы? Какую кодировку вы используете? Можете ли вы разместить свой код? – Oded

+0

десериализация? вы имеете в виду разбор? для какого языка/цели? – BiAiB

+0

В каком контексте появляются символы? Действительно ли это действительный XML или просто XML-подобный? –

ответ

8

Я предполагаю, что у вас проблема с кодировкой, а не в XMLReader, но с XmlSerializer.

Вы можете использовать кодировки XmlTextWriter и UTF8 с XmlSerializer, как в следующем фрагменте (см. Общие методы ниже, чтобы лучше реализовать его). Работает отлично с умлаутами (äöü) и другими специальными символами.

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

Лично я использую follwing общие методы для сериализации и десериализации XML и объектов и не имели никаких проблем с производительностью или кодирования еще.

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

Хм. Обтекание потока в XmlTextWriter, а затем передача writer.BaseStream кажется, что вы можете просто передать поток без XmlTextWriter. Тем более, что Deserialize хочет XmlReader, а не писателя, если вы собираетесь идти по этому маршруту. –

+0

@JesseChisholm. Вы правы, это имеет общий смысл. Я также нашел реализацию с 'StreamReader' парой клещей быстрее. –

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

Пытались что-то выше?

Я не проверял, но это возникло из виду. Мне удалось деанимизировать данные, содержащие åäö и т. Д. U не говорят о тэгах?

+0

как это поможет .. Я сожалею, что не понял! – genericuser

+0

Нравится , then ElementName = "årtal" –

+0

К сожалению, årtal вызывает исключение. –

1

То, что работает для меня похож на то, что @ мартеновской-buberl предложил:

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); 
    } 
} 
Смежные вопросы