Como abrir documentos XML com caracteres pt-BR

Olá. Este post complementa o post Como remover espaços e quebra de linha de documentos XML e apresenta alguns aspectos que foram deixados de lado. Para você poder aproveitar melhor será necessário que já tenha conhecimentos na linguagem C# e noções sobre o documento XML. O tema envolve tecnologias como criação de documentos XML, leitura de arquivos diretamente do disco, codificação de texto no Framewor .Net e criação de classes.

O problema de codificação de texto

Documentos de texto precisam armazenar dados sobre como o seu conteúdo deve ser tratado para que caracteres específicos de cada idioma possam ser representados pelo sistema operacional corretamente. Considere que as diferenças para idiomas como o inglês, o português e o japonês e pode começar a imaginar como fazer para exibir o texto corretamente em cada caso.

O Framework .Net resolve isto com a informação da codificação usada para a gravação e leitura dos arquivos contendo texto. O namespace System.Text possui a classe Encoding que oferece recursos para manipular deste textos sem acentuação – como códigos-fonte de programas – a textos que incluam caracteres específicos de um idioma. Existem métodos e classes que permite que você defina como o texto será gravado no arquivo. O código a seguir mostra como adicionar texto em um arquivo em um arquivo usando a codificação UTF8.

string path = @"c:\temp\MyTest.txt";
string appendText = "Texto a ser adicionando no arquivo.";
File.AppendAllText(path, appendText, Encoding.UTF8);

Arquivos XML e acentos

Documentos XML são usados para várias tarefas como armazenamento de configurações e intercâmbio de dados. Sua manipulação tende a ser complicada porque trata-se de um tipo de documento com hierarquia de nós, atributos e conteúdos. Para complicar um pouco mais, estes documentos limitam os caracteres que podem ser inseridos dependendo da codificação usada. A codificação do arquivo XML é definida no início com uma marcação especial como esta:

<?xml version="1.0" encoding="utf-8"?>

Neste exemplo, o “utf-8” indica qual a codificação usada para o texto sendo que esta é uma das mais comuns para os documentos XML permitindo criar a maior parte dos docuumentos deste tipo, inclusive com acentuação.

No post referenciado no início é feita a tarefa de remover espaços extras e quebras de linha para compactar um documento XML.

A compactação é útil em casos em que o tamanho do arquivo possa causar algum impacto como processamento em grandes quantidades de arquivos ou sua transmissão pela rede (ou na internet).

O código do do exemplo anterior possuia um problema de não poder processar documentos XML que possuíssem acentos. Isto porque não estava sendo tratada esta particularidade no processamento.

Normalizando documentos XML com acentos

Para que seja possível abrir e processar documentos XML com acentos e outros caracteres do idioma português é preciso no momento de criar o objeto que faz a leitura, informar qual a codificação a ser usada. O código a seguir mostra como fazer isto.

StreamReader sr = new StreamReader(sourceXml, Encoding.GetEncoding("ISO-8859-1");

Esta linha cria um objeto System.IO.StreamReader para carregar o conteúdo de um documento XML. Ao utilizar Encoding.GetEncoding(“ISO-8859-1”), o Frameowork usará esta codificação que é compatível com o idioma português para fazer a leitura do documento.

Classe para normalizar completa

Eu elaborei a classe a seguir a partir de minhas necessidades em um projeto de armazenamento de dados no banco. Estava precisando alterar as configurações de um objeto e gerar um XML normalizado. Porém, este objeto possuia acentos, e o código que eu tinha não estava sendo executado.

Se for usar este código é importante observar os usings que estão no começo para que funcione.

using System;
using System.Xml;
using System.IO;
using System.Text;

//
// Lê o conteúdo de um documento XML
// e remove espaços e quebra de linha
// gravando em um outro arquivo
//
public class XmlNormalize
{
    //Summary:
    //Executa a normalização
    public static void Compact(string sourceXml, string destXml)
    {
        var xml = new XmlDocument();

        using (StreamReader sr = new StreamReader(sourceXml, Encoding.GetEncoding("ISO-8859-1")))
        {
            xml.Load(sr);
        }

        using (XmlTextWriter xmlWriter = new XmlTextWriter(destXml, null))
        {
            xmlWriter.Formatting = Formatting.None;           
            xml.Save(xmlWriter);
        }
    }
}

O único método desta classe deve receber o nome do arquivo de origem para ler o XML e um arquivo de destino para fazer a gravação do conteúdo.

O primeiro blogo “using” abre o arquivo de origem carregando-o para o objeto XmlDocument criado anteriormente. Este bloco usa um StreamReader para leitura do disco e passa a informação sobre a codificação a ser usada.

A utilização dos blocos “using” é recomendada para fazer a liberação dos recursos – neste caso um arquivo gravado em disco – corretamente após a sua utilização.

Para completar a operação, é criado um objeto do tipo XmlTextWriter para gravar o conteúdo no arquivo de destino.

Est e código não faz tratamentos de erro nem verifica se o arquivo de origem existe, portanto, se for utilizá-lo, faça os tratamentos devidos.

Links

Os links abaixo oferecem detalhes sobre os recursos que foram usados neste post, todos diretamente da documentação oficial do Framework .Net. Boa pesquisa.

Classe XmlDocument
http://msdn.microsoft.com/pt-br/library/system.xml.xmldocument.aspx

Classe StreamReader (System.IO) - MSDN - Microsoft
http://msdn.microsoft.com/pt-br/library/system.io.streamreader.aspx

Classe XmlWriter (System.Xml)
http://msdn.microsoft.com/pt-br/library/system.xml.xmlwriter.aspx

Classe Encoding (System.Text)
http://msdn.microsoft.com/pt-br/library/system.text.encoding.aspx

File Class
http://msdn.microsoft.com/en-us/library/system.io.file.aspx