Como recuar após a nova linha no valor do elemento XML ao usar um XMLTextWriter?
-
22-08-2019 - |
Pergunta
Estou tentando recuar depois de uma nova linha ao usar um XMLTextWriter
Então, essencialmente eu quero isso
<?xml version="1.0" encoding="utf-16"?>
<element>
a
</element>
Mas usando o código abaixo, eu entendo isso
<?xml version="1.0" encoding="utf-16"?>
<element>
a
</element>
Aqui está o meu chicote de teste atual
[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());
}
Solução
O recuo especificado no escritor é para o indentação entre elementos onde não há espaço de branco significativo. O espaço em branco que você deseja criar é siginficant, porque faz parte do valor do texto entre as tags de abertura e fechamento.
Se o escritor fizesse isso no XML normal, ele estaria modificando o conteúdo do texto de maneira inaceitável. Você precisa fazer isso sozinho.
Outras dicas
Seu código não é inserido o que você diz para fazer, receio.
xmlWriter.WriteStartElement("element"); //<element>
xmlWriter.WriteString("\r\na\r\n"); //newline, directly followed by 'a'
xmlWriter.WriteEndElement(); //</element>
Se você quiser um recuo, terá que escrever isso em seu código, como
xmlWriter.WriteString("\r\n\ta\r\n");
O problema com essa abordagem é que se o seu <element>
Já está recuado, ele vai atrapalhar o recuo - seu 'A' ainda seria recuado exatamente uma guia.
Assim, você pode calcular o recuo de alguma forma e escrever o número apropriado de guias, ou você vai com todo o elemento em uma linha
<element>a</element>
Isso é definitivamente mais claro, mas pode parecer estranho quando 'A' se torna um texto muito longo.