.net – 反序列化XML时忽略指定的编码
我试图通过套接字读取从外部接口收到的一些
XML.
问题是 XML头中的编码指定错误(它表示iso-8859-1,但它是utf-16BE).据记载,编码是utf-16BE,但显然他们忘记设置正确的编码. 要在反序列化时忽略编码,我使用如下的StringReader: private static T DeserializeXmlData<T>(byte[] xmlData) { var xmlString = Encoding.BigEndianUnicode.GetString(xmlData); using (var reader = new StringReader(xmlString)) { reader.ReadLine(); // Eat header line using (var xmlReader = XmlReader.Create(reader)) { var serializer = new XmlSerializer(typeof(T)); return (T)serializer.Deserialize(xmlReader); } } } 以上实际上工作正常,但我不喜欢通过调用ReadLine跳过标题行的部分. 使用StreamReader解决方案 通过使用StreamReader,我可以覆盖XML标头中指定的编码.指定XmlReaderSettings.IgnoreProcessingInstructions与否没有任何区别. 回顾一下: >如果使用TextReader初始化XmlReader,则忽略XML标头编码. 总之,最强大的解决方案似乎是使用StreamReader,因为它使用字节顺序标记(如果存在). private static T DeserializeXmlData<T>(byte[] xmlData) { using (var xmlDataStream = new MemoryStream(xmlData)) { using (var reader = new StreamReader(xmlDataStream,Encoding.BigEndianUnicode)) { using (var xmlReader = XmlReader.Create(reader)) { var serializer = new XmlSerializer(typeof (T)); return (T) serializer.Deserialize(xmlReader); } } } }
我想我只是使用一个StreamReader,使用正确的编码构造并将其传递给XmlReader.Create(TextStream)方法:
using (var sr = new StreamReader(@"c:tempbad.xml",Encoding.BigEndianUnicode)) { using (var xr = XmlReader.Create(sr,new XmlReaderSettings())) { // etc... } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |