为什么xmlreader无法读取xmlwriter写的东西?

时间:2013-07-06 20:30:42

标签: c# xml xmlreader

我拥有世界上最简单的代码,

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字节顺序标记。无法切换到Unicode。”

我用Google搜索了异常并找到了几个解决方法,但我不明白为什么我需要一个解决方法,我只想阅读我写的xml。 有人可以解释一下究竟是什么问题? 我应该在xml中写一些不同的东西吗?

最简单的解决办法是什么?

1 个答案:

答案 0 :(得分:2)

您可能没有写入File.WriteAllText或香草FileStream不能执行的unicode文件。

而是使用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);