Подтвердить что ты не робот

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 или я должен связаться с ребятами интернет-провайдера, чтобы попросить обновление парсера?

4b9b3361

Ответ 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);

(он хокирован, но он работает ради целесообразности - по крайней мере, у вас будет хорошо сформированный файл для загрузки вашему онлайн-провайдеру);)