Как использовать XmlWriterSettings () при использовании переопределения void WriteEndElement ()?
Я работаю с устаревшим приложением, которое не импортирует сокращенные пустые элементы XML. Например:
ПЛОХОЙ пустой:
ХОРОШО пусто:
Я знаю решение для достижения этого, которое я представлю сейчас:
public class XmlTextWriterFull : XmlTextWriter
{
public XmlTextWriterFull(Stream stream, Encoding enc) : base(stream, enc)
{
}
public XmlTextWriterFull(String str, Encoding enc) : base(str, enc)
{
}
public override void WriteEndElement()
{
base.WriteFullEndElement();
}
}
и код клиента:
var x_settings = new XmlWriterSettings();
x_settings.NewLineChars = Environment.NewLine;
x_settings.NewLineOnAttributes = true;
x_settings.NewLineHandling = NewLineHandling.Replace;
x_settings.CloseOutput = true;
x_settings.Indent = true;
x_settings.NewLineOnAttributes = true;
//var memOut = new MemoryStream();
var writer = new XmlTextWriterFull(outputFilename, Encoding.UTF8); //Or the encoding of your choice
var x_serial = new XmlSerializer(typeof(YOUR_OBJECT_TYPE));
x_serial.Serialize(writer, YOUR_OBJECT_INSTANCE);
writer.Close();
Однако, если вы внимательно наблюдали заXmlWriterSettings
никогда не используются в клиентском коде. Поэтому вывод XML ужасно отформатирован. У меня такие вопросы: как мне адаптировать приведенный выше код для принятия?XmlWriterSettings
Использование методов создания фабрики и закрытых / внутренних / абстрактных классов затрудняет реализацию переопределения.
Я приму альтернативное решение, я не женат на моем вышеуказанном решении.
РЕШЕНИЕ ВРЕМЕННОГО РЕШЕНИЯШаг 1: создайте следующий класс в вашем решении:
public class XmlTextWriterFull : XmlTextWriter
{
public XmlTextWriterFull(TextWriter sink) : base(sink)
{
Formatting = Formatting.Indented;
}
public override void WriteEndElement()
{
base.WriteFullEndElement();
}
}
Шаг 2: Добавьте следующий код клиента. Обязательно замените YOUR_OBJECT_TYPE и YOUR_OBJECT_INSTANCE на класс и экземпляр, с которым вы работаете:
TextWriter streamWriter = new StreamWriter(outputFilename);
var writer = new XmlTextWriterFull(streamWriter);
var x_serial = new XmlSerializer(typeof (YOUR_OBJECT_TYPE));
x_serial.Serialize(writer, YOUR_OBJECT_INSTANCE);
writer.Close();
Обходной путь выше произведет следующее пустое форматирование элемента xml:
Проблема с этим обходным решением заключается в том, что он добавляет перевод строки (обратите внимание, что элементы находятся на отдельных строках). Это может быть приемлемо для вас, но вызывает проблемы с моим прежним приложением.