Можно ли поручить XmlSerializer .NET для сериализации XML-документы в следующем формате:XmlSerializer опускаем кодирующий атрибут
<?xml version="1.0"?>
<!DOCTYPE root SYSTEM "root.dtd">
<root>
...
</root>
т.е. XML декларация без атрибута кодирования, доктайп, а затем остальная часть документа?
В настоящее время у меня есть:
var bomlessUtf8Encoding = new UTF8Encoding(false);
var serializer = new XmlSerializer(typeof(T));
var namespaces = new XmlSerializerNamespaces();
namespaces.Add(string.Empty, string.Empty);
using (var memoryStream = new MemoryStream())
using (var xmlWriter = XmlWriter.Create(memoryStream, new XmlWriterSettings { Indent = false, Encoding = null }))
{
xmlWriter.WriteDocType(typeof(T).Name, null, ContentSerializer.MlpSvcInit320Dtd, null);
serializer.Serialize(xmlWriter, input, namespaces);
return bomlessUtf8Encoding.GetString(memoryStream.ToArray());
}
но .NET лает при создании XmlWriterSettings объекта из-за кодирования является нулевым. Есть ли канонический способ или проще всего сериализовать строку, а затем позвонить .Replace()
?
К сожалению, сторонний поставщик требует, чтобы сериализованная строка была точно в этом формате.
Спасибо! Похоже, что он работает (хотя я должен называть 'WriteStartDocument()' вручную). Есть ли способ сделать это с помощью 'XmlWriter'? Документация «XmlTextWriter» содержит примечание «Начиная с .NET Framework 2.0, мы рекомендуем вместо этого использовать класс System.Xml.XmlWriter.« – knittl
Эй, я действительно не знаю. Может быть, это сообщение в блоге поможет: http://www.cookcomputing.com/blog/archives/000577.html, он включает в себя переопределение некоторых классов, похоже на излишний для меня. – pmatyszok
Я проверяю сгенерированную строку в модульных тестах. Иногда я все еще получаю атрибут кодирования. Кажется, что есть какое-то состояние гонки (оно только вставлено, если я выполняю другие тесты вместе). Я создаю новый экземпляр 'XmlTextWriter' каждый раз, когда я сериализую XML. Что может случиться? – knittl