O Visual Basic ganhou na versão 9 os XML Literals. Um literal é algo muito simples, é uma maneira de criar um tipo sem precisar escrever New AlgumaClasse(“algum parametro”). Por exemplo, strings possuem literais:

dim valor = "Ola"

Nesse exemplo, valor é inferido como string.

E a mesma coisa existe para xml. Sim, xml possuem literais. Você pode fazer isso:

Dim xml = <elemento>
          </elemento>

E vai ser compreendido. Quer mais, ele reconhece o tipo pela formação do XML. O exemplo acima gera uma classe XElement. Veja o teste:

<TestMethod()>
Public Sub IssoEhUmXElement()
    'act
    Dim xml = <elemento>
              </elemento>
    'assert
    Assert.IsInstanceOfType(xml, GetType(XElement))
End Sub

Mas se você colocar o header do XML, o tipo muda para XDocument:

<TestMethod()>
Public Sub IssoEhUmXDocument()
    'act
    Dim xml = <?xml version="1.0" encoding="utf-8"?>
              <elemento>
              </elemento>
    'assert
    Assert.IsInstanceOfType(xml, GetType(XDocument))
End Sub

Esperto, né?

Quer ver ficar mais legal? Você pode importar um namespace XML, além de namespaces .Net. Aqui importei o de mapeamento do NHibernate:

Imports <xmlns="urn:nhibernate-mapping-2.2">

E usar esse import nos métodos. Veja só:

<TestMethod()>
Public Sub ConsigoObterItens()
    'act
    Dim xml = <?xml version="1.0" encoding="utf-8"?>
              <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
                  <class name="Pessoa">
                      <id name="id">
                          <generator class="native"/>
                      </id>
                      <property name="Nome"/>
                      <property name="Sobrenome"/>
                      <property name="Idade" type="System.Int32"/>
                  </class>
              </hibernate-mapping>

    'assert
    Dim classe1 = xml...<class>.FirstOrDefault()
    Assert.IsNotNull(classe1)
    Assert.AreEqual("Pessoa", classe1.@name)
    Assert.AreEqual("id", classe1.<id>.Single.@name)
    Assert.AreEqual("id", classe1.<id>.Single.@name)
    Assert.AreEqual(3, classe1.<property>.Count)
    Assert.IsNull(classe1.<property>.Skip(1).Take(1).Single.@type)
    Assert.AreEqual("System.Int32", classe1.<property>.Skip(2).Take(1).Single.@type)
End Sub

Viram que dá pra trabalhar expressões como “classe1.<id>.Single.@name”? Quer coisa mais legal? Dá pra aplicar Linq também. Aquela linha que define a variável classe1 pode ser trocada por esse linq (com um where a mais pra dar uma ideia):

Dim classe1 = (From x In xml.<hibernate-mapping>.<class>
               Where x.@name = "Pessoa"
               Select x).Single

E que tal criar o XML do zero, a partir de um objeto, com direito a loop e tudo. Veja só, nesse exemplo, em vez de fazer o xml hard coded, eu o crio com outros dados, referenciando propriedades de uma classe anônima, e inclusive itero pela propriedade “propriedades”, que retorna uma lista:

<TestMethod()>
Public Sub ConsigoCriarMapeamento()
    'arrange
    Dim mapeamento = 'prepara uma classe anônima (oculto)

    'act
    Dim xml = <?xml version="1.0" encoding="utf-8"?>
              <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
                  <class name=<%= mapeamento.name %>>
                      <id name=<%= mapeamento.id.name %>>
                          <generator class=<%= mapeamento.id.generator.class %>/>
                      </id>
                      <%= From p In mapeamento.properties
                          Select <property name=<%= p.Name %> type=<%= p.Type %>/>
                      %>
                  </class>
              </hibernate-mapping>

    'asserts igual os outros...
End Sub

Não tem coisa mais legal.

É por isso que eu adoro o VB.


Postado na(s) categoria(s) Visual Basic pelo Giovanni Bassi em 17 de maio de 2010 às 07:47 | Tags: ,

Comentários


maio 18. 2010 20:16
Daniel Moreira Yokoyama
Legal.

Não que esta vantagem seja lá grande coisa. Nunca precisei de algo do tipo, pois todos os xml's que usei estavam em arquivo, mesmo quando preciso trabalhar com eles em memória.

De fato, não vejo uma utilidade pra isso at all. Pois se a vantagem do xml é ser extensível, então quem usaria ele hard coded? Quer dizer. É legal. Legal mesmo. Mas, pelo que vejo, é útil apenas pra postar em blogs. Não tem muita aplicabilidade prática.

Stay Sharp.

http://gettingsharper.wordpress.com/http://gettingsharper.wordpress.com/


maio 18. 2010 22:27
Luiz Freneda
Daniel, se você ver a apresentação do pdc09 das novas features do vb, pode ser que mude de idéia: http://microsoftpdc.com/Sessions/FT32?type=wmvhigh

[]'s
Luiz Freneda

http://www.luizfreneda.com.br/http://www.luizfreneda.com.br/


Brazil Fabio
maio 19. 2010 18:52
Fabio
Giovanni, gostaria de ver o custo/tempo de execução disso.

É muito legal, mas acho que deva ter um custo considerável em grande escala.


Fabio Morikawa

no site


United States Alexandre Tarifa
maio 19. 2010 18:58
Alexandre Tarifa
Daniel, em casos onde vc tem uma estrutura xml e quer alimentar é mto legal isso... exemplo XML... inclusive vc pode mesclar linq to sql por exemplo.

VB está show, ainda mais depois do Anders colocar a mão!

[]´s

no site


maio 19. 2010 21:19
Daniel Moreira Yokoyama
@Luiz
Assisti o video. Uma porção de coisas que em C# eu já tenho, e uma porção de coisinhas bacanas mas que não fazem falta no C#. Não estou dizendo que não é bom. Só estou dizendo que fazer o equivalente em C# é tão fácil quanto ou não muito diferente. A única coisa realmente interessante foi a possibilidade de importar o namespace e o intellisense já reconhecer os elementos. Mas eu não acho que isso seja motivo pra idolatrar o Vb.

@Alexandre,
LinqToXml está disponível em C# tb. De forma que isso que vc citou tb é possível lá. O que eu questionei é a verdadeira utilidade do XmlLiterals. Não acho que alguém vá precisar de uma literal xml na prática. Na prática, se alguém usa, deve estar fazendo algo errado. Pois como pode ser uma boa prática deixar hard coded, dados em um formato que é, por definição, extensível.

Pessoal, eu adoraria mesmo que alguém me mostrasse uma utilidade prática disto. Mas, entendam, é apenas minha opinião, parece ser uma feature que só serve pra fazer demos e todo mundo bater palma.

http://gettingsharper.wordpress.com/http://gettingsharper.wordpress.com/


maio 21. 2010 13:38
Giovanni Bassi
Daniel, o mapeamento do NH já não está bom? É um exemplo prático. Ok, já temos o fluente, mas há outros casos semelhantes, é só fazer o paralelo.
E Linq to XML em C# dói demais... Podia ser muito mais fácil, como é no VB. E olha que eu adoro C#.

http://unplugged.giggio.net/http://unplugged.giggio.net/

Comentar


(Vai mostrar seu Gravatar)

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading



Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Sou consultor independente especialista em .Net, focado em arquitetura e melhores práticas. Tenho dezenas de artigos publicados na .Net Magazine, revista da qual sou editor técnico. Ministro palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Busca

Selos

Eu vou ao TechEd Brasil 2010, e você?

MVP

MCPD

MCSD

.Net Magazine

Abaixo ao if!

Calendário

«  setembro 2010  »
seteququsedo
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
Ver detalhamento de posts no calendário

Blogs interessantes

    OPMLDownload OPML file

    Postagens recentes

    Comentários recentes

    Disclaimer / Aviso
    As opiniões colocadas neste blog são minhas e pessoais e não expressam necessariamente as opiniões de meus empregadores, pareceiros e amigos. Da mesma forma, os comentários feitos por leitores do blog não expressam a minha opinião.

    © Copyright 2010 .Net Unplugged
    Log in