Pular para o conteúdo principal

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

Postagens mais visitadas deste blog

Como gerar scripts para exportar dados no SQL Server 2008

Uma das tarefas mais comuns no trabalho com desenvolvimento de software que consome dados em bancos como o SQL Server 2008 é a necessidade de em algum momento precisarmos exportar os dados de um banco para outro. Quer seja para realizar testes ou fazer simulações existem várias maneiras de se fazer isto. Neste post eu quero demonstrar um recurso do SQL Server Management Studio (SSMS) que permite realizar esta tarefa rapidamente.Para os que estão acostumados a usar esta ferramenta, já devem saber que é possível gerar scripts para o schema e também transferir os dados entre dois bancos distintos. Isto pode ser feito se o SSMS puder conectar-se com as duas bases, de origem e destino. No exemplo que vou dar, o objetivo é gerar o script apenas para uma tabela do banco de dados de exemplo da Microsoft – Northwind.1. Iniciando o assistenteO assistente deve ser iniciado clicando com o botão direito do mouse sobre o banco onde se encontra a tabela a qual iremos gerar o script. Deve se clicar n…

Pivot dinâmico com SQL Server

Passo a passo para usar pivoteamento dinâmicoOs bancos de dados bem configurados e definidos armazenam os dados de forma a otimizar o acesso, evitando duplicidade e garantindo a integridade. Porém, em muitas situações isto pode dificultar a apresentação de forma adequada sendo necessário preparar os dados usando vários recursos entre os quais, fazer o pivoteamento.Se você não precisou ainda usar ou não sabe o que é consiste em transformar cada linha de uma determinada coluna em colunas de uma nova consulta.Assim, considere uma tabela que armazene as notas bimestrais de um boletim. Uma possível estrutura para esta tabela seria algo assim:ColunaTipo de dado/TamanhoDisciplinanvarchar(50)BimestreIntNotanumeric(5,2)Uma consulta select nesta tabela com alguns dados traria um resultado parecido com o abaixo:Porém pode ser que para apresentar estes dados em um relatório seja necessário transformar cada bimestre em uma coluna e agrupar as notas nestas colunas para que fique dessa forma:Isto po…

Desabilitando o auto commit no SSMS (SQL Server Management Studio)

(Ou, como prevenir desastres e manter o emprego a salvo…)Neste post vai uma pequena mas tremendamente útil dica para desabilitar o auto commit da aplicação SQL Server Management Studio (SSMS) que é usada por dez entre dez usuários do banco de dados SQL Server para fazer consultas, alterações e executar scripts no banco de dados. (Preferências à parte, realmente muita gente usa),A primeira e mais importante notícia é que, diferentemente da ferramenta do Oracle, este editor de scripts do SQL Server vem com o recurso de auto commit ativado por padrão, assim, qualquer instrução DML (alteração dos dados com update, insert e delete) ou DDL (alteração no banco como create, drop, alter, etc.) será imediatamente enviada ao banco e persistida.Isto pode ser altamente crítico pois se estiver executando as instruções em um banco de dados de produção não haverá muitas formas de desfazer se é que haverá.Inicialmente, pode se evitar muitos acidades executando estas instruções dentro de um bloco BEGIN…