2011-02-04 46 views
5

我正在寻找快速的方式来反序列化的XML,具有特殊字符在它像ö。快速的方式来反序列化XML特殊字符

我用的XMLReader和它未能deserialze此类字符。

有什么建议吗?

编辑:我使用C#。 代码如下:

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

什么语言/平台?你使用什么编码?你能发布你的代码吗? – Oded 2011-02-04 15:44:52

+0

反序列化?你的意思是解析?为了什么语言/目的呢? – BiAiB 2011-02-04 15:46:23

+0

在chars的上下文中出现?它实际上是有效的XML,还是只是一个XML? – 2011-02-04 15:54:42

回答

8

我想你有一个编码问题,而不是XMLReader,但XmlSerializer

你可以在下面的代码片段使用与XmlSerializerXmlTextWriter和UTF8编码等(参见下面的泛型方法一种方法更好实现它)。用变音符号(äöü)和其他特殊字符工作得很好。

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); 
} 
0
[XmlElement(ElementName = "Profiles")] 
    //public ProfilesType[] Profiles { get; set; } 
    public Profiles Profiles { get; set; } 

尝试了上述的东西吗?

我没有检查,但这种窜出来的想法。我设法de +序列化具有åäö等的数据。 U不是在谈论标记名吗?

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