反序列化XML时忽略指定的编码

我正尝试读取通过套接字从外部接口接收的一些XML。 问题是在XML-header中指定了错误的编码(它表示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跳过标题行的部分。 有没有一种脆弱的方式来绕过在XML-header中指定的编码?

StreamReader解决方案

通过使用StreamReader,我可以覆盖在XML-header中指定的编码。 指定XmlReaderSettings.IgnoreProcessingInstructions或没有没有任何区别。 有趣的是,如果StreamReader发现unicode字节顺序标记,它将忽略指定的编码。

回顾一下:

  • 如果使用TextReader初始化XmlReader,则会忽略XML标头编码。
  • 如果使用StringReader,则如果存在unicode字节顺序标记,则XmlReader将失败。
  • 如果使用StreamReader,则unicode字节顺序标记将覆盖StreamReader编码。
  • 使用TextReader时,XmlReaderSettings.IgnoreProcessingInstructions = true并没有什么不同。
  • 总之,最强大的解决方案似乎是使用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...
         }
     }
    

    如果没有其他相关的处理指令,您可以通过设置XmlReaderSettings.IgnoreProcessingInstructions来忽略它们。

    链接地址: http://www.djcxy.com/p/48495.html

    上一篇: Ignoring specified encoding when deserializing XML

    下一篇: Annotations & Hibernate