2011-02-04 48 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); 
    } 
}