Почему 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();

Затем я записываю это в текстовый файл, который выглядит так:

<?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».

Я погуглил исключение и нашел несколько обходных путей, но я не понимаю, зачем мне нужен обходной путь, я просто хочу прочитать написанный мной xml. Может кто-нибудь объяснить, в чем именно проблема? Должен ли я написать что-то по-другому в xml?

Какое самое простое решение для этого?


person OopsUser    schedule 06.07.2013    source источник
comment
Используйте FileStream вместо StringWriter + запись в файл в примере, и все станет ясно.   -  person It'sNotALie.    schedule 07.07.2013
comment
Как сохранить xml-файл?   -  person Sergey Berezovskiy    schedule 07.07.2013
comment
Я добавил, как я пишу.   -  person OopsUser    schedule 07.07.2013
comment
msdn.microsoft.com/en-us/library/fysy0a4b.aspx имеет комментарии о том, почему StreamWriter не имеет маркера порядка байтов в разделе "Примечания". Не уверен, что понимаю, почему он делает это таким образом, но ясно, почему вы получаете поведение, которое видите. :)   -  person Chris    schedule 07.07.2013


Ответы (1)


Вероятно, вы пишете не в файл Unicode, который File.WriteAllText< /a> или ванильный FileStream не подходит.

Вместо этого используйте File.OpenWrite или FileStream в сочетании с < конструктор href="http://msdn.microsoft.com/en-us/library/3aadshsx.aspx" rel="nofollow">StreamWriter(Stream steam, Encoding encoding) для указания юникода.

Образец:

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);
person Dustin Kingen    schedule 06.07.2013