Home / Programmazione / C# - Asp.NET / Leggere file XML con LINQ
Mattepuffo

Leggere file XML con LINQ

Leggere file XML con LINQ

LINQ è uno dei tanti ottimi strumenti messi a disposizione dal .NET Framework.

In sostanza permette di interrogare diversi tipi di oggetti con una sintassi simile a quella dell'SQL.

Oggi lo useremo per estrapolare dati da un file XML.

Il file im questione è fatto così:

<?xml version="1.0" encoding="utf-8" ?>
 <persons>
   <person id="maggiorenne">
    <nome>FRANCO</nome>
    <cognome>FRANCHI</cognome>
   </person>
   <person id="minorenne">
    <nome>ALESSIO</nome>
    <cognome>ALESSI</cognome>
   </person>
   <person id="maggiorenne">
    <nome>MATTEO</nome>
    <cognome>MATTEI</cognome>
   </person>
   <person id="maggiorenne">
    <nome>PINO</nome>
    <cognome>PINI</cognome>
   </person>
 </persons>

Un semplice file che rappresenta delle persone con nom e cognome.

Ho aggiunto anche un attributo che useremo nel secondo esempio.

 

Prima di tutto vediamo l'esempio basico; nel mio Main ho questo:

XDocument doc = XDocument.Load(@"C:\person.xml");
var persons = from p in doc.Descendants("person")
  select new
  {
   nome = p.Element("nome").Value,
   cognome = p.Element("cognome").Value
  };
foreach (var person in persons)
{
  Console.WriteLine(person.nome + " " + person.cognome);
}

Con XDocument apriamo il file XML e lo carichiamo in memoria.

Sotto la "magia" di LINQ.

Come vedete con una sintassi simile a SQL facciamo una SELECT sul documento andando alla ricerca di un tag specifico, ed estrapolo i sotto nodi (nome e cognome).

con un foreach mi prendo i dati e li stampo.

Semplice no?

Nel secondo esempio invece faremo una SELECT prendendo solo quello che hanno attributo maggiorenne:

var persons2 = from p2 in doc.Descendants("person")
  where p2.Attribute("id").Value == "maggiorenne"
  select new
  {
   nome = p2.Element("nome").Value,
   cognome = p2.Element("cognome").Value
  };
foreach (var person2 in persons2)
{
  Console.WriteLine(person2.nome + " " + person2.cognome);
}

Ho aggiunto una clausola WHERE andando a cercare l'attributo id e a verificare se è unguale al valore maggiorenne.

Se è così me li prende e nel ciclo sottostante li stampo.

Molto easy!