2013-07-06 78 views
1

我有最簡單的代碼,在世界上,爲什麼xmlreader無法讀取xmlwriter寫入的內容?

using (XmlWriter writer = XmlWriter.Create(stringWriter)) 
{ 
writer.WriteStartDocument(); 
writer.WriteStartElement("Board"); 
writer.WriteAttributeString("Rows", mRows.ToString()); 
writer.WriteAttributeString("Columns", mColumns.ToString()); 
writer.WriteEndElement(); 
writer.WriteEndDocument(); 
} 
TextWriter writer1 = new StreamWriter(path); 
writer1.Write(stringWriter.toString()); 
writer1.Close(); 

然後我把它寫入一個txt文件,看起來像這樣:

<?xml version="1.0" encoding="utf-16"?> 
<Board Rows="30" Columns="50"> 
</Board> 

然後我執行以下操作:

FileStream str = new FileStream(s.FileName, FileMode.Open); 
using(XmlReader reader = XmlReader.Create(stream)) 
{ 
reader.Read(); 
} 

它拋出一個異常:

「沒有Unicode字節順序m方舟。不能切換到Unicode「

我GOOGLE了異常,發現了幾個解決方法,但我不明白爲什麼我需要一個解決方法,我只想讀取我寫的xml 可以請一些人解釋究竟是什麼問題是什麼? 我應該在XML?

什麼是這個最簡單的解決辦法嗎?

+1

使用一個FileStream,而不是一個StringWriter的+寫的例子文件,它應當變得清晰起來。 –

+1

如何保存xml文件? –

+0

我添加了我寫的方式。 – OopsUser

回答

2

你可能不會寫入Unicode文件,其File.WriteAllText或香草FileStream沒有做不同的寫東西。

Inste廣告使用File.OpenWriteFileStreamStreamWriter(Stream steam, Encoding encoding)構造函數結合使用來指定unicode。

樣品:

var path = @"C:\Dev\sample.xml"; 

string xml; 

var mRows = 30; 
var mColumns = 50; 

var options = new XmlWriterSettings { Indent = true }; 

using (var stringWriter = new StringWriter()) 
{ 
    using (var writer = XmlWriter.Create(stringWriter, options)) 
    { 
     writer.WriteStartDocument(); 
     writer.WriteStartElement("Board"); 
     writer.WriteAttributeString("Rows", mRows.ToString()); 
     writer.WriteAttributeString("Columns", mColumns.ToString()); 
     writer.WriteEndElement(); 
     writer.WriteEndDocument(); 
    } 
    xml = stringWriter.ToString(); 
} 

if(File.Exists(path)) 
    File.Delete(path); 

using(var stream = File.OpenWrite(path)) 
using(var writer = new StreamWriter(stream, Encoding.Unicode)) 
{ 
    writer.Write(xml); 
} 


Console.Write(xml); 

using(var stream = File.OpenRead(path)) 
using(var reader = XmlReader.Create(stream)) 
{ 
    reader.Read(); 
} 

File.Delete(path);