Como remover espaços e quebra de linha de documentos XML

A dica de hoje (após um longo e tenebroso inverno, que a propósito continua aqui no Paraná) nasceu de um incêndio que precisou ser apagado nos projetos da vida com prazo de entrega pra “ontem”… mas, vamos a parte divertida.

No Framework .NET a geração de documentos XML é facilitada de várias formas. Vamos partir do código abaixo para gerar um documento simples usando apenas System.Xml.

var xmlDoc = new XmlDocument();
XmlElement raiz = xmlDoc.CreateElement("artigo");
XmlElement Id = xmlDoc.CreateElement("id");
Id.InnerText = "08072011";
XmlElement Titulo = xmlDoc.CreateElement("titulo");
Titulo.InnerText = "Como remover espaços e quebra de linha de documentos XML";
XmlElement Vazio = xmlDoc.CreateElement("vazio");
Vazio.InnerText = String.Empty;
raiz.AppendChild(Id);
raiz.AppendChild(Titulo);
raiz.AppendChild(Vazio);
xmlDoc.AppendChild(raiz);
xmlDoc.Save(@"d:\teste.xml");


O código acima gera o arquivo “teste.xml” que ao ser visualizado em um editor como o bloco de notas apresenta o resultado abaixo.

image



Note que o elemento “Vazio”, originalmente criado para ficar, veja só, vazio, apresentou um conteúdo: embora não vejamos, o conteúdo do campo contém um retorno de carro e um avanço de linha.



Estes podem ser visualizados em um editor mais avançado como o Notepad++ que vai apresentar o resultado da próxima figura.



image



Lembre de clicar na ferramenta para exibir todos os caracteres.



Como diz “O Guia dos Mochileiros da Galáxia”: Don´t Panic!



Para corrigir este problema e remover os espaços em branco e também quebras de linha, basta usar um objeto XmlTextWriter para escrever o arquivo Xml em vez do nome do arquivo, para isto, substitua a última linha para o código que está descrito a seguir.





//xmlDoc.Save(@"d:\teste.xml");
using(XmlTextWriter xmlWriter= new XmlTextWriter(@"d:\teste.xml", null))
{
xmlWriter.Formatting = Formatting.None;
xmlDoc.Save(xmlWriter);
}



 


A classe XmlTextWriter implementa a interface IDisposable e é uma boa prática que seja instanciado dentro de um bloco “using” principalmente se o documento Xml criado precisar ser lido por outro processo logo após a sua criação.


 


Com isso, o arquivo é gravado sem a indentação dos nós e sem quebras de linhas:



image



Até a próxima.