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

标签 .net xml xmlserializer stringreader

我正在尝试通过套接字读取从外部接口(interface)接收到的一些 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 header 编码。
  • 如果使用 StringReader,如果存在 unicode 字节顺序标记,则 XmlReader 会失败。
  • 如果使用 StreamReader,则 unicode 字节顺序标记会覆盖 StreamReader 编码。
  • XmlReaderSettings.IgnoreProcessingInstructions = true 在使用 TextReader 时没有区别。

总而言之,最可靠的解决方案似乎是使用 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:\temp\bad.xml", Encoding.BigEndianUnicode)) {
     using (var xr = XmlReader.Create(sr, new XmlReaderSettings())) {
         // etc...
     }
 }

关于.net - 反序列化 XML 时忽略指定的编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4034207/

相关文章:

.net - 如何在没有代码分析警告的情况下一起使用 StringWriter 和 HtmlWriter

c# - 有没有一种在 Windows 窗体上播放 AVI 视频的简单方法?

c# - 将方法中的代码限制为仅调用同一类中的成员

c# - xmlNode.SelectSingleNode 始终返回相同的值,即使节点发生变化

xml - 如何修剪xslt中的特殊符号? (不仅限于空格)

c# - 字符串 '01/06/2015' 不是有效的 AllXsd 值

c# - 检查datagridview的单元格中的数据是否为空

java - 在 C# 中序列化 Java 对象和反序列化

c# - XmlSerializer - 序列化具有 URI 属性的对象时出错

c# - 使用 xsi :nil ="true" in C# 反序列化 XML 元素