2012-09-20 149 views
3
  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正常工作。讀取XML文件時出錯

這是什麼原因造成的?任何指針讚賞。

+0

你使用diff工具比較了兩個文件嗎? –

+0

您是否嘗試將'Encoing.UTF8'作爲第三個參數傳遞給'File.WriteAllText'方法? – greg84

回答

7

問題是StreamWriterXmlWriter正在添加一個字節順序標記。

選項:

  • 字符串的BOM從personText入手
  • new UTF8Encoding(false)而不是Encoding.UTF8StreamWriter
  • new UTF8Encoding(false)而不是Encoding.UTF8XmlWriter
  • 避免轉換爲文本,首先回來:你有MemoryStream中的二進制數據,爲什麼不只是轉儲到磁盤?
+0

謝謝!我需要它是字符串,所以第二個技巧。我如何做選項1? – Sam

+0

@Sam:你需要像'personText = personText.TrimStart('\ feff');' - 或者改變你傳遞給XmlWriter的編碼(我將添加它作爲一個選項) –

+0

謝謝。欣賞它。 – Sam