Как сделать отступ после новой строки в значении элемента xml при использовании XmlTextWriter?

Я пытаюсь сделать отступ после новой строки при использовании XmlTextWriter

По сути, я хочу этого

<?xml version="1.0" encoding="utf-16"?>
<element>
  a
</element>

но используя код ниже, я получаю это

<?xml version="1.0" encoding="utf-16"?>
<element>
a
</element>

Вот мой нынешний тестовый жгут

[Test]
public void XmlIndentingTest()
{
    var provider = new StringBuilder();
    var settings = new XmlWriterSettings
                       {
                           Indent = true,
                           IndentChars = "  ",
                       };
    using (var writer = new StringWriter(provider))
    {
        using (var xmlWriter = XmlTextWriter.Create(writer, settings))
        {
            xmlWriter.WriteStartElement("element");
            xmlWriter.WriteString("\r\na\r\n");
            xmlWriter.WriteEndElement();
        }
    }
    Debug.WriteLine(provider.ToString());
}

2 ответа

Решение

Отступ, указанный в модуле записи, предназначен для отступов между элементами, в которых нет значительных пробелов. Пробел, который вы хотите создать, является значительным, поскольку он является частью текстового значения между открывающим и закрывающим тегами.

Если бы писатель сделал это с обычным xml, он бы изменил текстовое содержимое недопустимым способом. Вы должны сделать это самостоятельно.

Боюсь, ваш код точно соответствует тому, что вы говорите.

xmlWriter.WriteStartElement("element"); //<element>
xmlWriter.WriteString("\r\na\r\n");     //newline, directly followed by 'a'
xmlWriter.WriteEndElement();            //</element>

Если вы хотите сделать отступ, вам нужно написать это в своем коде, например:

xmlWriter.WriteString("\r\n\ta\r\n");    

Проблема с этим подходом заключается в том, что если ваш <element> уже с отступом, это испортит отступ - ваш 'a' все равно будет с отступом ровно на одной вкладке.

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

<element>a</element>

Это определенно понятнее, но может показаться странным, когда "а" становится очень длинным текстом.

Другие вопросы по тегам