tucaz.blog.now() Rotating Header Image

Lendo e consumindo XML com dynamic em C# 4

Sei que faz tempo que não posto então aqui vai um post rápido, mas com conteúdo (espero que vocês vejam dessa forma também). Finalmente comecei a trabalhar efetivamente com C# 4 e por coincidência (ou não) já precisei de dynamic objects pra resolver um problema.

Meu sistema recebe como entrada alguns arquivos XML para serem processados e transformados em outros objetos posteriormente. XML é um saco e é definitivamente uma das coisas que eu mais odeio em desenvolvimento de software. Tudo com XML é trabalhoso. Sendo assim criei uma pequena Lib que transforma XML em objetos dinamicos pra eliminar a necessidade de lidar com nós e atributos diretamentes e também permitir futuras implementacões.

Com XmlToObjectParser é possível:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
  <cd country="USA">
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <price>10.90</price>
  </cd>
  <cd country="UK">
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <price>10.0</price>
  </cd>
  <cd country="USA">
    <title>Greatest Hits</title>
    <artist>Dolly Parton</artist>
    <price>9.90</price>
  </cd>
</catalog>
var numberOfCDsinCatalog = catalog.catalog.cd.Count; //Retorna 3
var titleFromUKCD = catalog.catalog.cd[1].title; // Retorna "Hide your heart"

Bem mais legível e prático de usar, na minha opinião.

O projeto e a DLL compilada estão no GitHub assim como a documentacão e informacões adicionais.

Enjoy! :)

4 Comments

  1. Casion disse:

    Oi amigo,

    desculpa, mas não entendi a parte do dynamic. Pelo seu código não tem nada usando dynamic, certo?

    abraços

    1. tucaz disse:

      Opa @Casion,

      ele é todo baseado em Dynamic. Sem Dynamic seria impossível implementar essa biblioteca. Dynamic basicamente impede que o compilador faca a checagem do seu tipo no momento da compilacão. ExpandoObject implementa a interface (IDynamicMetaObjectProvider) que permite tipos Dynamic.

      Você deve estar falando isso, pois está vendo o IDictionary ai, certo?

      ExpandoObject implementa IDictionary pra permitir a adicão dinamica de propriedades em runtime. Quando eu chamo o método Add a implementacão de ExpandoObject adiciona a chave que eu passo, dinamicamente (provavelmente com reflection – estou vendo a implementacao agora no Reflector pra entender) como uma propriedade no objeto em questão e como ele é Dynamic o compilador pula a checagem de tipos na hora de compilar permitindo que a propriedade seja lida dinamicamente em tempo de execucão.

      Se voce quiser saber mais recomendo a seguinte leitura:

      http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx
      http://msdn.microsoft.com/en-us/library/dd264736.aspx

      1. Casion disse:

        Ah entendi, obrigado pelo esclarecimento!

        mas então eu não teria Intellisense no código para consumir essa estrutura de XML, correto?

        afinal, a IDE desconhece a estrutura do xml.

        Essa funcionalidade do Dynamic eu até conheço, pois ela é baseada na estrutura do Microsoft Visual Fox Pro 9, linguagem RAD da Microsoft que foi descontinuada no ano passado.

        abraços!

        1. Tucaz disse:

          Você esta certo. O intelisense vai pro balalau não só pra esse objeto mas pra qualquer dynamic.

Leave a Reply