JcmSoft - VB.NET     Migrando arquivos Textos delimitados para XML

Os arquivos textos delimitados já foram um padrão muito usados na representação de formato de dados entre fonte de dados. Com a chegada da XML podemos representar os dados de uma maneira mais rica em um formato de arquivo XML mantendo as vantagens dos arquivos textos. Podemos então converter arquivos textos delimitados em arquivos XML e aproveitar toda funcionalidade que a plataforma .NET oferece para o tratamento destes arquivos , afinal , um dos pilares da plataforma .NET é a XML.

Neste artigo eu vou mostrar um exemplo prático de como você pode migrar um arquivo texto delimitado para XML usando a ADO.NET. Para isto vou mostrar como podemos explorar as classes XML  e os namespaces da livraria de classes da plataforma .NET e como usá-las no VB .NET para ler , escrever e navegar em documentos XML.

Para obter informações sobre os conceitos básicos da XML - Extensible Markup Language - leia os artigos já publicados no site em :

  1. XML - eXtensible Markup Language - Introdução
  2. VB6 - Integrando XML com Visual Basic.

Além disto eu já escrevi dois artigos (listados abaixo) abordando a utilização da XML na plataforma .NET. Fique por dentro acessando os links:

  1. Criando o seu livro de visitas

  2. ADO.NET - Carregando um DataGrid com os dados de um arquivo XML

As classes da RunTime Library da plataforma .NET que podemos usar para trabalhar com XML estão armazenadas em cinco namespaces , a saber :

  1. System.Xml

  2. System.Xml.Schema

  3. System.Xml.Serialization

  4. System.Xml.XPath

  5. System.Xml.Xsl

Embora cada uma destes namespaces tenham um propósito distinto todas as classes residem em um único assembly , o assembly : System.Xml.dll

Então , antes de poder usar as classes XML em seus programas você vai precisar incluir uma referência ao assembly System.XML.dll e usar os namespaces através da palavra chave Imports.

Eu vou começar pela parte prática onde irei mostrar como podemos migrar um arquivo texto delimitado para um arquivo XML. Abaixo eu começo mostrando o arquivo texto delimitado alunos.txt e ao seu lado o arquivo alunos.xml gerado pelo código do projeto que iremos criar:

Codigo   Artes    Historia      Portugues
A290     Marco    Miriam       Jessica
B301     Janice   Jefferson    Paulo
C349     Larissa  Bianca       Fernanda
D500     Isaque  Ygor          Yuri
E702     Rebeca  Viviane      Renata
<?xml version="1.0" standalone="yes"?>
<Alunos xmlns="8a Serie">
<Classe>
    <Codigo>A290</Codigo>
    <Artes>Marco</Artes>
    <Historia>Miriam</Historia>
    <Portugues>Jessica</Portugues>
</Classe>
<Classe>
    <Codigo>B301</Codigo>
    <Artes>Janice</Artes>
    <Historia>Jefferson</Historia>
    <Portugues>Paulo</Portugues>
</Classe>
<Classe>
    <Codigo>C349</Codigo>
    <Artes>Larissa</Artes>
    <Historia>Bianca</Historia>
    <Portugues>Fernanda</Portugues>
</Classe>
<Classe>
    <Codigo>D500</Codigo>
    <Artes>Isaque</Artes>
    <Historia>Ygor</Historia>
    <Portugues>Yuri</Portugues>
</Classe>
<Classe>
    <Codigo>E702</Codigo>
    <Artes>Rebeca</Artes>
    <Historia>Viviane</Historia>
    <Portugues>Renata</Portugues>
</Classe>
</Alunos>
O arquivo alunos.txt O arquivo alunos,.xml

Como você pode notar o arquivo texto é um arquivo onde eu represento as turmas de alunos identificadas por um código para cada matéria definida. O arquivo XML representa melhor esta informação com riqueza de detalhes (embora o arquivo seja muito simples).

A seguir eu estou exibindo o código que irá abrir o arquivo alunos.txt presente na pasta c:\teste e irá gerar o arquivo alunos.xml na mesma pasta:

Imports System

Imports System.IO

Imports System.Collections

Imports System.Data

Imports System.Text

 

Module modXML

Sub Main()

  Dim strXML As String

  'chama a função para gerar o arquivo xml

  strXML = DataSetDelimitado(vbTab, "c:/teste/alunos.txt")

End Sub

Function DataSetDelimitado(ByVal strDelimitador As String, ByVal strCaminhoArquivo As String) As String

'define as variáveis e objetos usados no codigo

Dim oDS As New DataSet()

Dim strCampos As String

Dim oTabela As New DataTable()

Dim oLinhas As DataRow

Dim intContador As Int32 = 0

Dim oLinha As DataRow()

 

'define o cabeçalho do arquivo XML

oDS.DataSetName = "Alunos"

oDS.Namespace = "8a Serie"

oDS.Tables.Add("Classe")

Dim oSR As New StreamReader(strCaminhoArquivo)

'vai para o inicio do arquivo

oSR.BaseStream.Seek(0, SeekOrigin.Begin)

'Inclui as colunas de cabeçalho do arquivo

For Each strCampos In oSR.ReadLine().Split(strDelimitador)

    oDS.Tables(0).Columns.Add(strCampos)

Next

 

'Inclui as linhas do arquivo

oTabela = oDS.Tables(0)

While (oSR.Peek() > -1)

   oLinhas = oTabela.NewRow()

     For Each strCampos In oSR.ReadLine().Split(strDelimitador)

      oLinhas(intContador) = strCampos

      intContador = intContador + 1

    Next

   intContador = 0

   oTabela.Rows.Add(oLinhas)

End While

 

'grava o arquivo xml gerado

oDS.WriteXml("c:/teste/alunos.xml")

'retorna o xml para a função

Return oDS.GetXml()

End Function

End Module

Como funciona ?

strXML = DataSetDelimitado(vbTab, "c:/teste/alunos.txt")

-  A linha de código acima invoca a função - DataSetDelimitado() - e passa os parâmetros : tipo de delimitação (no nosso caso uma tabulação - vbTab) e o nome do arquivo texto com sua localização

oDS.DataSetName = "Alunos"

oDS.Namespace = "8a Serie"

oDS.Tables.Add("Classe")

 

- As linhas de código acima mostram a flexibilidade da utilização da ADO.NET e sua integração com XML. Estou definindo a representação do meu XML através das propriedades - DataSetName e Namespace - do objeto DataSet. Ao final estou incluindo uma tabela chamada classe.

 

Dim oSR As New StreamReader(strCaminhoArquivo)

oSR.BaseStream.Seek(0, SeekOrigin.Begin)

 

- O código acima esta usando o objeto StreamReader para ler o arquivo texto e a seguir ir para o inicio do arquivo.

 

For Each strCampos In oSR.ReadLine().Split(strDelimitador)

    oDS.Tables(0).Columns.Add(strCampos)

Next

 

- As linhas acima percorrem o arquivo texto e incluem os cabeçalhos(nome que identificam as colunas) na tabela  classe. A função Split é usada para separar cada coluna usando o delimitador (Tab) como parâmetro.

 

oTabela = oDS.Tables(0)

 

While (oSR.Peek() > -1)

   oLinhas = oTabela.NewRow()

     For Each strCampos In oSR.ReadLine().Split(strDelimitador)

      oLinhas(intContador) = strCampos

      intContador = intContador + 1

    Next

   intContador = 0

   oTabela.Rows.Add(oLinhas)

End While

 

- Finalmente , instanciamos um objeto DataTable e criamos um objeto DataRow ; para a seguir preencher cada linha da tabela com os dados separados pela função Split.

 

oDS.WriteXml("c:/teste/alunos.xml")

 

Salvamos então o arquivo XML gerado e...

 

Return oDS.GetXml()

 

retornamos o arquivo XML para a função como uma string.

Com este exemplo prático você percebeu que é muito fácil trabalhar com XML no VB. NET. Na verdade podemos ter duas maneiras principais de trabalhar com arquivos XML no VB .NET:

  1. Usando o Document Object Model - DOM

  2. Usando objetos de leitura e gravação - XmlTextReader/XmlTextWriter

O DOM representa a interface de programação-padrão que o consórcio World Wide Web ( www.w3.org) recomenda para trabalhar com XML; existe uma versão da DOM para os principais sistemas operacionais. Basicamente a idéia da DOM consiste em que um arquivo XML pode ser descrito em termos de uma árvore hierárquica de nós. Veja a figura abaixo e diga se você concorda com isto:

<?xml version="1.0" standalone="yes"?>
<Alunos xmlns="8a Serie">
<Classe>
    <Codigo>A290</Codigo>
    <Artes>Marco</Artes>
    <Historia>Miriam</Historia>
    <Portugues>Jessica</Portugues>
</Classe>
</Alunos>

O arquivos Alunos.xml simplificado. A representação em uma árvore hierárquica de nós

Como o VB .NET possui um editor para arquivos XML (é isso mesmo), podemos abrir o arquivo XML no editor do VB .NET e exibir sua estrutura. Veja na figura abaixo o exemplo onde eu estou abrindo o arquivo e exibindo a estrutura do XML:

O editor permite a geração de diversos tipos e estruturas que integram os esquemas XML. Depois que você criar um esquema basta associá-lo a um arquivo XML. O VB .NET irá fornecer os recursos de intellisense para os atributos e elementos definidos no esquema.

 aguarde que vai continuar... ...


José Carlos Macoratti