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 :
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:
As classes da RunTime Library da plataforma .NET que podemos usar para trabalhar com XML estão armazenadas em cinco namespaces , a saber :
System.Xml
System.Xml.Schema
System.Xml.Serialization
System.Xml.XPath
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 SystemImports System.IOImports System.CollectionsImports System.DataImports System.Text
Module modXMLSub Main() Dim strXML As String 'chama a função para gerar o arquivo xml strXML = DataSetDelimitado(vbTab, "c:/teste/alunos.txt") End SubFunction 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:
Usando o Document Object Model - DOM
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