XML - Apresentando XML Literals (VB.NET)


O titulo do artigo pode dar a sugerir que se trata de uma novidade mas na verdade os XML Literals estão disponíveis a partir do .NET Framework 3.5/Visual Studio 2008 e dão suporte a grande parte da especificação Extensible Markup Language (XML) 1.0.

Mas o que vem a ser esse tal de 'XML Literals' ?

Os XML Literals são um recurso que permite que você incorpore a sintaxe XML diretamente no seu código.

A sintaxe XML literal representa objetos LINQ to XML, sendo semelhante à sintaxe XML 1.0. Isto torna mais fácil criar elementos XML e documentos de programação porque seu código possui a mesma estrutura que o XML final.

O Visual Basic compila literais XML em objetos LINQ to XML sendo que o LINQ to XML fornece um modelo de objetos simples para criar e manipular XML, e esse modelo se integra bem com a Language-Integrated Query (LINQ).

Você pode inserir uma expressão Visual Basic em um literal XML. Em tempo de execução, o aplicativo cria um objeto LINQ to XML para cada literal, incorporando os valores das expressões incorporadas. Isso permite que você especifique conteúdo dinâmico dentro de um literal XML.

Vamos começar com um exemplo mais simples possível para você sentir o recurso.

Abra o Visual Basic 2010 Express Edition e crie um novo projeto do tipo Console Application com o nome XML_Literal;

A seguir no Module1.vb inclua o código mostrado na figura abaixo:

Executando o projeto teremos:

Um literal XML pode abranger várias linhas sem usar caracteres de continuação de linha (o espaço sublinhado).Isto torna mais fácil comparar literais XML no código com documentos XML.O compilador trata caracteres de continuação de linha como parte de um literal XML. Portanto, você deve usar o espaço-sublinhado só quando ele fazer parte do objeto LINQ to XML.

Embutindo consultas em XML Literals

Você pode usar uma consulta em uma expressão incorporada. Quando você fizer isso, os elementos retornados pela consulta são adicionados ao elemento XML. Isso permite que você adicione conteúdo dinâmico, como o resultado de uma consulta do usuário, a um literal XML.

Por exemplo, o código a seguir usa uma consulta incorporada para criar elementos XML dos membros do array telefones e depois adicionar esses elementos como filhos de contatos.

Vamos usar a mesma solução criada no início incluindo apenas um novo projeto; para isso clique no menu File->Add -> New Project e escolha o modelo Console Application informando o nome XML_Literals2;

A seguir digite o código abaixo no Module1.vb:

Module Module1

    Sub Main()
        ' Inicializa os objetos

        Dim telefones As Telefone() = {
            New Telefone("residencia", "206-555-0144"),
            New Telefone("trabalho", "425-555-0145")}

        ' Converte os dados contidos em telefones para XML
        Dim contato =
            <contato>
                <nome>Jose Carlos Macoratti</nome>
                <%= From fone In telefones
                    Select <telefone tipo=<%= fone.Tipo %>><%= fone.Numero %></telefone>
                %>
            </contato>

        Console.WriteLine(contato)
        Console.ReadKey()
    End Sub

    Class Telefone
        Public Tipo As String
        Public Numero As String
        Public Sub New(ByVal tip As String, ByVal num As String)
            Tipo = tip
            Numero = num
        End Sub
    End Class

End Module

O compilador Visual Basic converte os literais XML em chamadas para o construtor LINQ to XML equivalente para construir o objeto LINQ to XML.

No nosso exemplo, o compilador Visual Basic irá fazer o seguinte :

Criando e consultando Documentos XML

Podemos criar documentos XML definindo o seguinte XML literal no início do artigo: <?xml version="1.0"?>

Vamos criar um novo projeto no Visual Basic 2010 Express Edition via menu File-> New Project escolhendo o template Windows Forms Application com o nome XML_Literals_WF;

Vamos incluir no formulário padrão os controles :

Conforme o leiaute da figura abaixo:

a- Criando e listando o conteúdo de um documento XML

No evento Click do botão de comando - Listar nomes - vamos incluir o código abaixo:

  Private Sub btnLista_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLista.Click
        Dim Livros = _
       <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <livraria>
               <livro nome="Programming Visual Basic .NET" autor="Franceso Balena"/>
               <livro nome="Coding Techniques for Microsoft Visual Basic" autor="John Connel"/>
               <livro nome="Mastering Microsoft Visual Basic 2008" autor="Evangelos Petroutsos"/>
               <livro nome="Mastering Microsoft Visual Basic 2010" autor="Evangelos Petroutsos"/>
               <livro nome="Visual Basic 2008 Programmer's" autor="Rod Stephens"/>
               </livraria>

        For Each livro In From element In Livros.<livraria>.<livro>
            lstDados.Items.Add(livro.@nome.ToString)
        Next

    End Sub

Neste código estamos criando o documento XML e usando um laço for each para percorrer o documento listando os nomes dos livros.

Note que como o nome do livro é um atributo estamos usando o caractere @ antes do atributo nome;

Executando o projeto e clicando no botão - Listar nomes - temos:

b- Pesquisando um documento XML

Podemos usar uma consulta LINQ to XML para realizar uma consulta no documento XML criado.

No evento Click do botão de comando Procurar Livro digite o código a seguir:

 Private Sub btnProcurar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcurar.Click
        Dim Livros = _
       <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
       <livraria>
           <livro nome="Programming Visual Basic .NET" autor="Franceso Balena"/>
           <livro nome="Coding Techniques for Microsoft Visual Basic" autor="John Connel"/>
           <livro nome="Mastering Microsoft Visual Basic 2008" autor="Evangelos Petroutsos"/>
           <livro nome="Mastering Microsoft Visual Basic 2010" autor="Evangelos Petroutsos"/>
           <livro nome="Visual Basic 2008 Programmer's" autor="Rod Stephens"/>
       </livraria>

        Dim procuraLivro = From livro In Livros.<livraria>.<livro> _
                         Where livro.@nome.ToString.Contains(txtBusca.Text) _
                         Select livro.@nome, livro.@autor

        lstDados.Items.Clear()
        For Each livro In From element In procuraLivro
            lstDados.Items.Add("Livro: " & livro.nome)
            lstDados.Items.Add("Autor: " & livro.autor)
            lstDados.Items.Add(New String("-"c, 40))
        Next

    End Sub

A consulta LINQ é exibida a seguir:

Dim procuraLivro = From livro In Livros.<livraria>.<livro> _
                              Where livro.@nome.ToString.Contains(txtBusca.Text) _
                              Select livro.@nome, livro.@autor

Seleciona no documento XML os nomes e autores dos livros que contém o critério informado no controle txtBusca.Text;

O laço for each percorre o resultado exibindo o nome e o autor do livro:

For Each livro In From element In procuraLivro
    lstDados.Items.Add("Livro: "
& livro.nome)
    lstDados.Items.Add("Autor: "
& livro.autor)
    lstDados.Items.Add(New String("-"c, 40))
Next

No exemplo informamos o critério 'Visual' e o resultado obtido foi o seguinte:

Criando e salvando o XML

Veremos agora outro exemplo onde vamos usar um DataTable para criar o documento XML e a seguir salvar o XML no disco.

Inclua um novo controle Button (btnSalvar) com o texto : Salvar XML

A seguir no evento Click deste botão inclua o código abaixo:

Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click
        Try
            ' Criando um DataTable manualmente
            Dim dt As New DataTable("Livros")
            dt.Columns.Add("Livro", GetType(String))
            dt.Columns.Add("Autor", GetType(String))
            dt.Rows.Add("Programming Visual Basic .NET", "Franceso Balena")
            dt.Rows.Add("Coding Techniques for Microsoft Visual Basic", "John Connel")
            dt.Rows.Add("Visual Basic 2008 Programmer's", "Rod Stephens")
            Dim ds As New DataSet
            ds.Tables.Add(dt)

            ' Cria um XML com dois atributos: "nome" e "autor"  
            Dim listaLivros = _
               <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
               <livraria>
                   <livros>
                       <%= From b In ds.Tables("Livros") Select _
                           <livro nome=<%= b.Item("Livro") %>
                               autor=<%= b.Item("Autor") %>/> %>
                   </livros>
               </livraria>

            ' Salva o xml no disco
            listaLivros.Save("c:\dados\livaria.xml")
            MessageBox.Show(" Arquivo  << livraria.xml >> salvo em c:\dados ")
        Catch ex As Exception
            MessageBox.Show(" Erro : " + ex.Message)
        End Try
    End Sub

Executando o projeto teremos o arquivo XML salvo no local indicado. Abrindo o XML podemos conferir o resultado:

 
 

Alterando valores do documento XML

Alterar um documento XML usando XML Literals é bem simples basta ler o documento, especificar o elemento que deseja alterar e fazer a alteração.

No evento Click do botão btnAlterar inclua o código abaixo:

 Private Sub btnAlterar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAlterar.Click

        Try
            'carrega o arquivo xml 
            Dim arquivoXML = XDocument.Load("c:\dados\livraria.xml")

            'localiza o elemento a ser alterado
            Dim elemento = arquivoXML...<livro>.Where(Function(f) _
                                     f.@nome = txtCriterio.Text)

            'alterando o nome o autor (apenas para efeito de teste pois eu não sou o autor do livro)
            elemento.@autor = txtNovoValor.Text
            arquivoXML.Save("c:\dados\livraria.xml")

        Catch ex As Exception
            MessageBox.Show(" Erro : " + ex.Message)
        End Try
    End Sub

Executando o projeto teremos:

 
 

Após realizar a alteração podemos verificar no arquivo XML o valor alterado conforme acima.

Pegue o projeto completo aqui: XML_Literals_WF.zip

Rom 13:11 E isso fazei, conhecendo o tempo, que já é hora de despertardes do sono; porque a nossa salvação está agora mais perto de nós do que quando nos tornamos crentes.
Rom 13:12
A noite é passada, e o dia é chegado; dispamo-nos, pois, das obras das trevas, e vistamo-nos das armas da luz.
Rom 13:13
Andemos honestamente, como de dia: não em glutonarias e bebedeiras, não em impudicícias e dissoluções, não em contendas e inveja.

Rom 13:14
Mas revesti-vos do Senhor Jesus Cristo; e não tenhais cuidado da carne em suas concupiscências.

Referências:


José Carlos Macoratti