Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

LINQ-To-Xml: Visual Basic 2008 e i namespace XML, tra Intellisense e inferenza di schemi

Quando lavoriamo con documenti XML di grandi dimensioni o che contengono molti nodi, può capitare di non ricordare con esattezza tutti gli elementi e/o attributi che caratterizzano i vari nodi. Lavorando con LINQ, quindi, sebbene aiutati dall’Intellisense, potremmo avere qualche difficoltà. Sarebbe quindi interessante implementare una sorta di code snippet che facilitino l’utilizzo degli elementi XML nell’esecuzione delle nostre query.

 

In questo post vedremo come, nel progettare l’esecuzione di una query con LINQ e Visual Basic 2008, sia possibile utilizzare i namespace XML nella scrittura di codice managed e come utilizzare l’inferenza negli schemi XML per consentire all’Intellisense di riconoscere più facilmente gli elementi appartenenti al documento XML col quale vogliamo lavorare.

 

In primo luogo, dobbiamo dotarci di uno strumento gratuito chiamato XML To Schema Inference Wizard, che Microsoft ha rilasciato appositamente per Visual Basic 2008 e che si integra nell’ambiente di lavoro. Dopo averlo scaricato da questo indirizzo (e dopo averlo ovviamente installato), avviate Visual Basic 2008 e create un nuovo progetto per la Console, che per il nostro scopo è sufficiente. L’esempio proposto è molto semplice: in un documento XML è memorizzato un piccolo elenco di post pubblicati su questo blog, per ciascuno dei quali è specificata la categoria (WPF, VSTO, LINQ); tramite codice Visual Basic (ossia tramite una query in LINQ) estrapoleremo solo i post appartenenti alla categoria WPF.

 

Se volete avere a disposizione il sorgente completo, prima di iniziare, potete reperirlo a questo indirizzo.

 

In primo luogo, definiamo il file XML contenente i dati di nostro interesse. Utilizzando il comando Add new item del menu Project, aggiungete un file XML chiamato BlogPost.Xml, il cui contenuto sarà il seguente:

 

<?xml version="1.0"?>

<Elenco xmlns="DelSole.EsempiLinq.BlogPost">

 

  <Post>

    <Titolo>Text-to-speech in italiano con Visual Basic 2008</Titolo>

    <Categoria>WPF</Categoria>

  </Post>

 

  <Post>

    <Titolo>LINQ: Esempio di query con Visual Basic 2008</Titolo>

    <Categoria>LINQ</Categoria>

  </Post>

 

  <Post>

    <Titolo>VSTO 2008: aggiungere un segnalibro in Word con VB 2008</Titolo>

    <Categoria>VSTO</Categoria>

  </Post>

 

  <Post>

    <Titolo>VSTO 2008: Utilizzare controlli WPF nelle soluzioni Office con VB 2008</Titolo>

    <Categoria>VSTO</Categoria>

  </Post>

 

  <Post>

    <Titolo>WPF: Il controllo RepeatButton (VB 2008)</Titolo>

    <Categoria>WPF</Categoria>

  </Post>

</Elenco>

 

Come potete osservare, per ciascun post vengono specificati il titolo e la categoria di appartenenza, quindi un esempio piuttosto semplice. Di rilevante interesse, invece, è l’aggiunta di un namespace al nodo Elenco (tramite l’attributo xmlns). Questo ci occorrerà più avanti, per individuare con esattezza gli elementi XML di interesse tramite Intellisense. È importante ricordare di impostare la proprietà Build Action di questo file su Content e la proprietà Copy to output directory su Copy always.

 

Ora, andiamo ad utilizzare lo strumento scaricato in precedenza. Come il nome suggerisce, XML To Schema Inference Wizard genera uno schema XML (quindi un file in formato .Xsd) per il documento specificato. Sempre utilizzando il comando Add new item del menu Project, selezionate l’elemento XML To Schema (aggiunto tra i modelli personali), assegnando al nuovo file il nome BlogPost.Xsd, come in figura:

 

 

Fatto questo, compare la finestra del Wizard. Sarà sufficiente selezionare il documento XML predisposto in precedenza (quindi BlogPost.xml) e fare click su OK:

 

 

 

Come potete vedere, è possibile specificare un file XML esistente, un contenuto XML sul web o incollare del codice contenuto negli Appunti. Il tool genera uno schema XML, a partire dal nostro file di dati. Per capire l’utilità di questo schema, passiamo al file di codice (nella fattispecie il modulo principale dell’applicazione Console). Per prima cosa, aggiungiamo la seguente riga di codice:

 

Imports <xmlns:BlogPost="DelSole.EsempiLinq.BlogPost">

 

Magia! L’istruzione Imports di Visual Basic 2008 ci consente di importare namespace XML oltre che quelli relativi alle consuete librerie di classi .NET. Il seguente codice, adeguatamente commentato (da inserire nella Sub Main), esegue la query sui post contenuti nell’elenco, estrapolando quelli appartenenti alla categoria WPF (seguono ulteriori commenti):

 

    Sub Main()

 

        'Carica il documento XML dalla directory dell'applicazione

        Dim Elenco = XDocument.Load(CurDir() + "\BlogPost.xml")

 

        'Esegue una query sull'elenco di tutti i post (From..In..)

        'E laddove il post è nella categoria WPF (Where...)

        'Lo seleziona (Select)

        Dim WPF = From post In Elenco...<BlogPost:Post> _

                  Where post.<BlogPost:Categoria>.Value = "WPF" _

                  Select name = post.<BlogPost:Titolo>.Value

 

        For Each articolo In WPF

            Console.WriteLine(articolo)

        Next

 

        Console.ReadLine()

    End Sub

 

La cosa di interesse maggiormente rilevante è l’utilizzo del namespace XML, come ad esempio potete osservare nei tag <BlogPost:Post> o <BlogPost:Categoria>. Se scrivete il codice di cui sopra manualmente, piuttosto che fare copia-incolla da qui (J) noterete che l’Intellisense si mostra come in figura:

 

 

In pratica, l’Intellisense, grazie allo schema XML generato dal tool XML To Schema e alla dichiarazione del namespace XML (mostrato tra l'altro nella tooltip descrittiva), è in grado di mostrare i vari elementi appartenenti al namespace e di completare il code snippet in corso di scrittura, semplificando il compito dello sviluppatore nel selezionare gli elementi di interesse nell’ambito delle query LINQ.

 

Se avviate l’applicazione di esempio, verranno mostrati due risultati. Solo che, oltre ad aver visto un piccolo esempio di query in Visual Basic 2008, avete imparato alcuni utili trucchi per migliorare e velocizzare la scrittura di codice basato su LINQ-To-Xml.

 

Ogni qual volta si affronta un argomento un po’ più complesso (anche da spiegare!) mi auguro sempre che l’argomento stesso possa essere utile e di interesse.

 

Alessandro

 

Print | posted on lunedì 25 febbraio 2008 21:07 | Filed Under [ Visual Basic LINQ ]

Powered by:
Powered By Subtext Powered By ASP.NET