XDocument: сохранение XML в файл без спецификации
Я генерирую файл utf-8 XML с помощью XDocument
.
XDocument xml_document = new XDocument(
new XDeclaration("1.0", "utf-8", null),
new XElement(ROOT_NAME,
new XAttribute("note", note)
)
);
...
xml_document.Save(@file_path);
Файл сгенерирован правильно и проверен с успехом xsd файл.
Когда я пытаюсь загрузить XML файл в онлайн-службу, служба сообщает, что мой файл wrong at line 1
; Я обнаружил, что проблема вызвана спецификацией в первых байтах файла.
Знаете ли вы, почему спецификация добавлена к файлу и как я могу сохранить файл без него?
Как указано в Знак порядка байтов Статья в Википедии:
В то время как стандарт Unicode позволяет специфицировать UTF-8 он не требует или рекомендуем. У байтового заказа нет значение в UTF-8, поэтому только спецификация служит для идентификации текстового потока или файл как UTF-8 или что он был преобразован из другого формата, который имеет спецификацию
Является ли это проблемой XDocument
или я должен связаться с ребятами интернет-провайдера, чтобы попросить обновление парсера?
Ответы
Ответ 1
Используйте XmlTextWriter
и передайте это методу XDocument Save(), таким образом вы сможете больше контролировать тип используемого кодирования:
var doc = new XDocument(
new XDeclaration("1.0", "utf-8", null),
new XElement("root", new XAttribute("note", "boogers"))
);
using (var writer = new XmlTextWriter(".\\boogers.xml", new UTF8Encoding(false)))
{
doc.Save(writer);
}
Конструктор класса UTF8Encoding
имеет перегрузку, которая указывает, следует ли использовать спецификацию байта (байтовый порядок) с булевым значением в вашем случае false
.
Результат этого кода был проверен с помощью Notepad ++ для проверки кодировки файла.
Ответ 2
Прежде всего: поставщик услуг ДОЛЖЕН обрабатывать его, согласно спецификации XML, которая заявляет, что спецификация может присутствовать в случае представления UTF-8.
Вы можете принудительно сохранить свой XML без спецификации следующим образом:
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = new UTF8Encoding(false); // The false means, do not emit the BOM.
using (XmlWriter w = XmlWriter.Create("my.xml", settings))
{
doc.Save(w);
}
(Googled from here: http://social.msdn.microsoft.com/Forums/en/xmlandnetfx/thread/ccc08c65-01d7-43c6-adf3-1fc70fdb026a)
Ответ 3
Самый эффективный способ избавиться от символа спецификации при использовании XDocument - это просто сохранить документ, затем выполнить прямой файл, считанный как файл, а затем записать его обратно. Подпрограммы File будут лишать вас символа:
XDocument xTasks = new XDocument();
XElement xRoot = new XElement("tasklist",
new XAttribute("timestamp",lastUpdated),
new XElement("lasttask",lastTask)
);
...
xTasks.Add(xRoot);
xTasks.Save("tasks.xml");
// read it straight in, write it straight back out. Done.
string[] lines = File.ReadAllLines("tasks.xml");
File.WriteAllLines("tasks.xml",lines);
(он хокирован, но он работает ради целесообразности - по крайней мере, у вас будет хорошо сформированный файл для загрузки вашему онлайн-провайдеру);)