System.Xml.XmlException: "Отсутствует метка порядка байт в Юникоде. Переход в Юникод невозможен."
public Form1()
{
InitializeComponent();
if (File.Exists("D:\\Data.xml"))
{
}
else
{
var balance = new Balance
{
Money = 0,
LastIncome = 0,
LastLoss = 0,
Income = 0,
Loss = 0,
};
var xmlSerializer = new XmlSerializer(typeof(Balance));
var stringWriter = new StringWriter();
xmlSerializer.Serialize(stringWriter, balance);
string xml = stringWriter.ToString();
File.WriteAllText("D:\\Data.xml", xml);
}
Balance b = new Balance();
XmlDocument xDoc = new XmlDocument();
xDoc.Load("D:\\Data.xml");
}
Ответы (1 шт):
Автор решения: Yitzhak Khabinsky
→ Ссылка
XML был сериализован как utf-16 в файловой системе:
<?xml version="1.0" encoding="utf-16"?>
Это создало конфликт между прологом XML (utf-16) и фактической кодировкой тела файла XML (utf-8). Вот почему загрузка XML-документа не удалась в этой строке:
xDoc.Load("D:\\Data.xml");
Решение было простым. Используйте LINQ to XML и рассматривайте XML как тип данных XML. Я закомментировал не нужные строки. Конечный результат XML сериализуется следующим образом:
<?xml version="1.0" encoding="utf-8"?>
и все работает.
c#
void Main()
{
const string fileName = @"e:\temp\Data.xml";
if (File.Exists(fileName))
{
}
else
{
var balance = new Balance
{
Money = 0,
LastIncome = 0,
LastLoss = 0,
Income = 0,
Loss = 0,
};
var xmlSerializer = new XmlSerializer(typeof(Balance));
var stringWriter = new StringWriter();
xmlSerializer.Serialize(stringWriter, balance);
XElement xml = XElement.Parse(stringWriter.ToString());
// File.WriteAllText(fileName, xml);
XDocument doc = new XDocument(new XDeclaration("1.0", "utf-8", null), xml);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = "\t";
settings.Encoding = new UTF8Encoding(false);
using (XmlWriter writer = XmlWriter.Create(fileName, settings))
{
doc.Save(writer);
}
}
// Balance b = new Balance();
// XmlDocument xDoc = new XmlDocument();
// xDoc.Load("D:\\Data.xml");
XDocument xDoc = XDocument.Load(fileName);
}
public class Balance
{
public int Money { get; set; }
public int LastIncome { get; set; }
public int LastLoss { get; set; }
public int Income { get; set; }
public int Loss { get; set; }
}
Output file
<?xml version="1.0" encoding="utf-8"?>
<Balance xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Money>0</Money>
<LastIncome>0</LastIncome>
<LastLoss>0</LastLoss>
<Income>0</Income>
<Loss>0</Loss>
</Balance>