Как использовать 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:



Проблема с этим обходным решением заключается в том, что он добавляет перевод строки (обратите внимание, что элементы находятся на отдельных строках). Это может быть приемлемо для вас, но вызывает проблемы с моим прежним приложением.

Ответы на вопрос(5)

Ваш ответ на вопрос