C# 为什么xmlreader可以';我不读xmlwriter写的东西?

C# 为什么xmlreader可以';我不读xmlwriter写的东西?,c#,xml,xmlreader,C#,Xml,Xmlreader,我有世界上最简单的代码 using (XmlWriter writer = XmlWriter.Create(stringWriter)) { writer.WriteStartDocument(); writer.WriteStartElement("Board"); writer.WriteAttributeString("Rows", mRows.ToString()); writer.WriteAttributeString("Columns", mColumns.ToStrin

我有世界上最简单的代码

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>
它抛出了一个异常:

“没有Unicode字节顺序标记。无法切换到Unicode。”

我在谷歌上搜索了这个异常,找到了几个变通方法,但我不明白为什么我需要一个变通方法,我只想阅读我编写的xml。 有人能解释一下到底是什么问题吗? 我应该在xml中写些不同的东西吗


最简单的解决方案是什么?

您可能没有写入unicode文件,而unicode文件或vanilla文件则没有这样做

而是使用或
FileStream
结合构造函数来指定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);

在本例中,使用FileStream而不是StringWriter+写入文件,它将变得清晰。如何保存xml文件?我添加了我的写入方式。对为什么
StreamWriter
在备注部分没有字节顺序标记进行了说明。我不知道它为什么这样做,但它清楚地说明了为什么你会有你所看到的行为
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);