XDocument: сохранение XML в файл без спецификации - PullRequest
33 голосов
/ 09 февраля 2011

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

Ответы [ 3 ]

61 голосов
/ 09 февраля 2011

Используйте XmlTextWriter и передайте его в метод Save () XDocument, чтобы вы могли лучше контролировать тип используемой кодировки:

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 имеетперегрузка, которая указывает, следует ли использовать BOM (Byte Order Mark) с логическим значением, в вашем случае false.

Результат этого кода был проверен с помощью Notepad ++ для проверки кодировки файла.

27 голосов
/ 09 февраля 2011

Прежде всего: поставщик услуг ДОЛЖЕН обработать его в соответствии со спецификацией 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);
}

(Гуглил отсюда: http://social.msdn.microsoft.com/Forums/en/xmlandnetfx/thread/ccc08c65-01d7-43c6-adf3-1fc70fdb026a)

1 голос
/ 04 ноября 2011

Наиболее целесообразный способ избавиться от символа спецификации при использовании XDocument - просто сохранить документ, затем выполнить прямое чтение файла в виде файла, а затем записать его обратно.Подпрограммы Файла вычеркнут персонажа для вас:

        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);

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

...