代码之家  ›  专栏  ›  技术社区  ›  Sam

读取XML文件时出错

  •  3
  • Sam  · 技术社区  · 13 年前
                Person person = GetPerson();
                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add(string.Empty, string.Empty);
                XmlSerializer serializer = new XmlSerializer(typeof(Person));
                string personText = string.Empty;
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, new XmlWriterSettings() { Encoding = Encoding.UTF8 }))
                    {
                        serializer.Serialize(xmlWriter, person, ns);
                        xmlWriter.Flush();
                        personText = Encoding.UTF8.GetString(memoryStream.ToArray());
                    }
                }
    
                string path = @"D:\person.xml";
    // Write method 1:
                File.WriteAllText(path, personText);
    
    // Write method 2:
                using (StreamWriter streamWriter = new StreamWriter(path, false , Encoding.UTF8))
                {
                    streamWriter.Write(personText);
                }
    
    // Read the xml
                using (FileStream fileStream = new FileStream(path, FileMode.Open))
                {
                    return XDocument.Load(XmlReader.Create(fileStream));
                }
    

    当我在使用方法2编写之后读取xml时,我在根级别得到的数据是无效的。第1行,位置1。但使用方法1效果良好。

    是什么原因造成的?感谢任何指点。

    1 回复  |  直到 13 年前
        1
  •  7
  •   Jon Skeet    13 年前

    问题是 StreamWriter 这个 XmlWriter 正在添加字节顺序标记。

    选项:

    • 字符串BOM表 personText 一开始
    • 通过 new UTF8Encoding(false) 而不是 Encoding.UTF8 对于 流写入程序
    • 通过 新的UTF8编码(false) 而不是 编码.UTF8 对于 XmlWriter(XmlWriter)
    • 首先要避免转换为文本再转换回来: MemoryStream ,为什么不直接转储 那个 到磁盘?