Kader Yildirim
LINQ à 360 degré, Partie 2
Cet article présente les principales fonctionnalités apportées par LINQ to XML
Par Kader Yildirim publié le 14/06/2007 à 19:28, lu 8828 fois, 6 pages
 5 | LINQ to XSD
Dans le code précédent pour récupérer le prix nous avons écrit un code du type

(int)x.Element("prix")

Si un XSD est associé au document XML et que LINQ to XSD est installé alors le code précédent devient

x.prix

Ainsi on a une propriété du bon type (celui décrit dans le XSD) ce qui évite des cast inutiles et permet de typer l'accès aux éléments du document XML donnant ainsi la possibilité de valider dès la compilation le travail fait par le développeur.

Après avoir installé l'extension Linq to XSD de Visual Studio Orcas, un nouveau type de projet est accessible dans l'environnement de développement :
 
/content/09078e3e-8165-40ff-92cd-37f16c578831/Linq2XSD1.PNG
 
Une fois que le projet est créé il suffit d'ajouter un schéma XSD au projet :
 
/content/09078e3e-8165-40ff-92cd-37f16c578831/Linq2XSD2.PNG
 
Dans notre cas le XSD est le suivant :

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

           targetNamespace="http://www.techheadbrothers.com/xlinq"

           xmlns="http://www.techheadbrothers.com/xlinq"

           elementFormDefault="qualified">

    <xs:element name="commandes">

        <xs:complexType>

            <xs:sequence>

                <xs:element ref="commande" maxOccurs="unbounded"/>

            </xs:sequence>

        </xs:complexType>

    </xs:element>

    <xs:element name="commande">

        <xs:complexType>

            <xs:sequence>

                <xs:element name="acheteur" type="xs:string"/>

                <xs:element name="produit" type="xs:string"/>

                <xs:element name="prix" type="xs:int"/>

            </xs:sequence>

            <xs:attribute name="id" use="required" type="xs:string"/>

        </xs:complexType>

    </xs:element>   

</xs:schema>

Maintenant il suffit de configurer la compilation du XSD avec l'option LinqToXsdSchema dans la catégorie Build Action :
 
/content/09078e3e-8165-40ff-92cd-37f16c578831/Linq2XSD3.PNG
 
Pour l'utiliser dans le code il faut tout d'abord compiler au moins une fois le projet afin de s'assurer que la classe associée au XSD est générée par le compilateur. Puis il faut référencer le namespace du document XSD en C#. Dans notre cas :

using www.techheadbrothers.com.xlinq;

Pour avoir des détails sur la classe produite par le compilateur il suffit de parcourir l'assembly avec l'object browser :
 
/content/09078e3e-8165-40ff-92cd-37f16c578831/Linq2XSD4.PNG
 
Ainsi le code devient :

static void DoJobNewWay3()

        {

            var data = new[] {

                   new { Id="123456", Acheteur="Pierre", Produit="Robot de cuisine", Prix=451 },

                   new { Id="7890123", Acheteur="Paul", Produit="Voiture de course", Prix=43657 },

                   new { Id="avcf568", Acheteur="Dupont", Produit="Casserole", Prix=356 }

               };               

 

            XNamespace ns = "http://www.techheadbrothers.com/xlinq";

            XElement xml = new XElement(ns + "commandes",

                   from d in data

                   select new XElement(ns + "commande",

                       new XAttribute("id", d.Id),

                       new XElement(ns + "acheteur", d.Acheteur),

                       new XElement(ns + "produit", d.Produit),

                       new XElement(ns + "prix", d.Prix)

                   )

                );

 

            commandes c = (commandes)xml;

 

            var result = from x in c.commande

                        where x.prix < 500

                        select x.acheteur + " : " +

                                x.produit + " : " +

                                x.id;

 

            foreach (string s in result)

                Console.WriteLine(s);

        }

Le code est non seulement plus lisible mais le développeur profite aussi de l'intellisense et du typage fort qui lui permet de vérifier la qualité de ce qu'il est en train de coder dès la compilation.

Grâce à toutes ces fonctionnalités Linq to XSD permet de combler le gap entre la programmation XML et objet. Non seulement les types mais aussi les contraintes du XSD (unicité, cardinalité...) sont reprises fidèlement dans les classes générées assurant ainsi une quasi bijectivité entre les deux mondes.
 
» Démarrer une discussion
 
Discussion démarée par fico.stephane le 14/06/2007 à 22:26, 2 commentaire(s).