2014-10-20 3 views
0

Можно ли поручить 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()?

К сожалению, сторонний поставщик требует, чтобы сериализованная строка была точно в этом формате.

ответ

1

XmlTextWriter дает вам возможность удалить атрибут encoding. Если вы передадите в качестве кодировки, xml будет кодироваться с использованием UTF-8, но атрибут encoding будет удален.

Так что-то вроде этого:

using(var xmlWriter = new XmlTextWriter(memoryStream, null)) 

должен быть подходящим. Вы также можете установить Indent и т. Д., См. http://msdn.microsoft.com/pl-pl/library/system.xml.xmltextwriter(v=vs.110).aspx

+0

Спасибо! Похоже, что он работает (хотя я должен называть 'WriteStartDocument()' вручную). Есть ли способ сделать это с помощью 'XmlWriter'? Документация «XmlTextWriter» содержит примечание «Начиная с .NET Framework 2.0, мы рекомендуем вместо этого использовать класс System.Xml.XmlWriter.« – knittl

+0

Эй, я действительно не знаю. Может быть, это сообщение в блоге поможет: http://www.cookcomputing.com/blog/archives/000577.html, он включает в себя переопределение некоторых классов, похоже на излишний для меня. – pmatyszok

+0

Я проверяю сгенерированную строку в модульных тестах. Иногда я все еще получаю атрибут кодирования. Кажется, что есть какое-то состояние гонки (оно только вставлено, если я выполняю другие тесты вместе). Я создаю новый экземпляр 'XmlTextWriter' каждый раз, когда я сериализую XML. Что может случиться? – knittl

Смежные вопросы