Você está na página 1de 15

LINQ to XML

Version 1.1

Chapitre 04 - LINQ to XML

Sommaire

1 2

Prsentation .................................................................................................................................... 3 Les diffrentes classes de LINQ to XML ........................................................................................... 4 2.1 2.2 XDocument et XElement :............................................................................................ 4 XAttribute et XComment : ........................................................................................... 5

Les mthodes et proprits ............................................................................................................ 5 3.1 3.2 Mthodes de XDocument (hrite de XContainer ) : ..................................................... 6 Mthodes de XElement (hrit de XContainer ) : ........................................................ 7

4 5 6

Diffrentes utilisations de LINQ to XML .......................................................................................... 9 Exemples........................................................................................................................................ 11 Conclusion ..................................................................................................................................... 15

Dotnet France Association

Chapitre 04 - LINQ to XML

1 Prsentation
LINQ permet dtablir des requtes sur du XML de manire gnrique. C'est--dire que LINQ nest pas un langage qui permet de raliser ces requtes exclusivement dans du XML. LINQ permet galement la rcupration de donnes depuis une base de donnes SQL, des objets, etc. Dans ce chapitre, nous allons nous intresser au LINQ to XML, aussi appel XLinq. Dans le but dutiliser LINQ to XML, il est utile dajouter la librairie System.Xml.Linq . Afin de mieux comprendre ce chapitre, il est conseill davoir dj lu les chapitres Introduction au LINQ et LINQ to Objects . Vous y trouverez notamment des dfinitions, des mots-cls, la syntaxe, lutilisation de LINQ dans un projet, etc. De plus, le chapitre Windows Form ou ASP.NET XML (ADO.NET) permet une meilleure comprhension du langage XML. Voici un diagramme de classe de System.Xml.Linq :

Dotnet France Association

Chapitre 04 - LINQ to XML

2 Les diffrentes classes de LINQ to XML


Pour commencer, nous allons apprendre nous servir de XLinq et plus prcisment de ses classes. Contrairement au XML o les classes sont prfixes de Xml , dans LINQ to XML celles-ci sont prfixes de X . Par exemple, XmlDocument devient XDocument , XmlElement devient XElement , etc. Afin de mieux dcouvrir ces classes, nous illustreront nos explications dexemples. Nous crerons dans un premier temps un document XML, aucune requte LINQ ne sera ralise pour le moment.

2.1 XDocument et XElement :


C#
XDocument document = new XDocument( new XElement("Racine", new XElement("Test", "Contenu"), new XElement("Test2", new XElement("Fils","Test russi")), new XElement("Test3", "Contenu"))); Console.WriteLine(document); Console.Read();

VB.NET
Dim document As XDocument = <?xml version="1.0" encoding="utf-8"?> <Racine> <Test>Contenu</Test> <Test2> <Fils>Test russi</Fils> </Test2> <Test3>Contenu</Test3> </Racine> Console.WriteLine(document) Console.Read()

XDocument correspond au document XML. XElement , lui, correspond un nud. En VB.NET, la dclaration du document XML doit tre place au dbut de la cration de celui-ci pour quil soit correctement considr comme un XDocument . Dans le cas contraire, il sera considr comme un XElement ce qui provoquera une erreur. En C#, cette ligne de dclaration est rajoute automatiquement. Les types XDocument et XElement hritent tous deux de la classe abstraite XContainer . Cette classe implmente des mthodes permettant, entre-autre, la recherche dun nud suivant ou prcdent dans un document XML. Cette classe elle-mme hrite de la classe XNode . Dans le cas prsent, nous utilisons le constructeur de la classe XDocument qui prend en paramtre tous les lments de type XML pouvant tre inclus dans un document du mme type. XElement est assez similaire la seule diffrence quil attend en premier argument le nom qui lui sera attribu. De la mme manire quen XML, XDocument cre linstruction de traitement. Par dfaut, lencodage des caractres est UTF-8 et la version est 1.0 .

Dotnet France Association

Chapitre 04 - LINQ to XML

2.2 XAttribute et XComment :


C#
XDocument document = new XDocument( new XElement("Racine", new XAttribute("id","test"), new XElement("Test", "Contenu"), new XElement("Test2", new XAttribute("ID", "0"), new XElement("Fils","Test russi")), new XComment("Voici un commentaire"), new XElement("Test3", "Contenu"))); Console.WriteLine(document); document.Save(@"C:\MyProject\ConsoleApplication3\ConsoleApplication3\Test.x ml"); Console.Read();

VB.NET
Dim document As XDocument = <?xml version="1.0" encoding="utf-8"?> <Racine id="test"> <Test>Contenu</Test> <Test2 ID="0"> <Fils>Test russi</Fils> </Test2> <!--Voici un commentaire--> <Test3>Contenu</Test3> </Racine> Console.WriteLine(document) Console.Read()

XAttribute cre un attribut et prend comme argument le nom de cet attribut et sa valeur. Llment XComment cre un commentaire et ne prend un String en argument reprsentant le contenu du commentaire.

Llment XDeclaration , quant lui, permet de spcifier ou dobtenir la dclaration pour le traitement du document XML. Il est notamment demand la version du document et lencodage des caractres.

3 Les mthodes et proprits


Il est utile de connaitre les classes inhrentes LINQ to XML, mais il sera encore plus intressant den connaitre les mthodes et proprits. Les tableaux ci-dessous dcrivent les mthodes et proprits disponibles pour les classes vues prcdemment.

Dotnet France Association

Chapitre 04 - LINQ to XML

3.1 Mthodes de XDocument (hrite de XContainer ) :


Mthodes / Proprits CreateReader CreateWriter Declaration DescendantNodes Description Cre un XmlReader pour le nud courant. Crer un XmlWriter pour le nud courant. Obtient ou dfinit la dclaration du document. Retourne une collection des nuds descendant contenus dans le document ou le nud courant. Retourne une collection des lments descendant contenus dans le document ou le nud courant. Surcharg. Obtient la dfinition du type du document(ou DTD) pour ce document. Retourne une collection qui contient les lments enfants correspondant au document ou llment pass en argument. Surcharg. Permet de crer un XDocument. Elle prend en argument le lien vers le fichier, un TextReader, ou encore un XmlReader. Surcharg. Retourne une collection des nuds enfants de llment courant ou du document. Supprime les nuds enfants de llment courant ou du document. Remplace les nuds enfants de llment courant ou du document par les arguments spcifis. Surcharg. Obtient le nud racine du document XML. Permet de sauvegarder le XDocument vers le fichier spcifi (sil nexiste pas il sera cr). Il peut aussi prendre en argument un TextWriter ou un XmlWriter. Surcharg.

Descendants

DocumentType Elements

Load

Nodes

RemoveNodes ReplaceNodes

Root Save

Dotnet France Association

Chapitre 04 - LINQ to XML

3.2 Mthodes de XElement (hrit de XContainer ) :


Mthodes / Proprits Add AddAfterSelf AddBeforeSelf AddFirst Attribute Attributes

Ajoute les arguments en tant quenfant de cet lment. Surcharg. Ajoute les arguments immdiatement aprs llment. Surcharg. Ajoute les arguments immdiatement avant llment. Surcharg. Ajoute les arguments en tant que premier enfant. Surcharg. Retourne lattribut de cet lment au nom spcifi. Retourne une collection de tous les attributs de llment courant. Surcharg. Crer un XmlReader pour le nud courant. Crer un XmlWriter qui peut tre utilis pour ajouter des nuds au conteneur courant. Retourne le premier lment enfant correspondant au nom spcifi. Retourne une collection contenant les lments adjacents cet lment qui se trouvent aprs celui-ci et qui correspondent au nom spcifi. Surcharg. Retourne une collection contenant les lments adjacents cet lment qui se trouvent avant celui-ci et qui correspondent au nom spcifi. Surcharg. Obtient le premier nud enfant du nud courant. Retourne une collection de tous les nuds se situant aprs le nud courant. Retourne une collection de tous les nuds se situant aprs le nud courant qui correspondent llment actuel ou au document. Surcharg. Retourne un boolen dfinissant si le nud en question possde au moins un attribut. Retourne un boolen dfinissant si le nud contient au moins un lment enfant. Retourne un boolen dfinissant si llment contient une valeur. Obtient le dernier nud enfant du nud courant. Obtient le nud adjacent suivant le nud courant. Dotnet France Association

CreateReader CreateWriter

Element ElementsAfterSelf

ElementsBeforeSelf

FirstNode DescendantNodes

Descendants

HasAttributes

HasElements

IsEmpty LastNode NextNode

Chapitre 04 - LINQ to XML NodeType Nodes Obtient le type du nud courant. Retourne une collection des nuds enfants de llment courant ou du document. Retourne une collection contenant les nuds adjacents se trouvant aprs ce nud. Retourne une collection contenant les nuds adjacents se trouvant avant ce nud. Obtient le nud parent du nud courant. Obtient le nud prcdent du nud courant. Supprime ce nud. Supprimer tous les attributs de llment courant. Supprime les nuds enfants de llment courant ou du document. Remplace les nuds enfants par les arguments spcifis. Surcharg. Remplace ce nud par les arguments spcifis. Surcharg. Sauvegarde larborescente XML du nud dans un fichier, un XmlTextWriter , un TextWriter ou encore un XmlWriter . Permet de dfinir la valeur, de supprimer ou dajouter un lment enfant. Permet de dfinir la valeur, de supprimer ou dajouter un lment enfant. Obtient le contenu de cet lment.

NodesAfterSelf

NodesBeforeSelf

Parent PreviousNode Remove RemoveAttributes RemoveNodes ReplaceNodes ReplaceWith Save

SetAttributeValue

SetElementValue

Value

Dotnet France Association

Chapitre 04 - LINQ to XML

4 Diffrentes utilisations de LINQ to XML


Il est conseill, avant de continuer, davoir pris connaissance du chapitre Introduction au LINQ , du chapitre sur LINQ to Objects et du chapitre Windows Form ou ASP.NET XML (ADO.NET) . Cela dit, dans un souci de comprhensions, nous effectuerons certains rappels. LINQ to XML peut tre utilis pour effectuer des requtes dans un XDocument ou galement dans une base de donnes dont les informations seront stockes dans un XDocument ou un XElement . Des exemples de diffrentes difficults sont venir. Requte sur un XDocument :
C#
XDocument doc = new XDocument( new XElement("Racine", new XElement("Element", new XAttribute("special", "Admin"), "Utilisateur Admin"), new XElement("Element", "Utilisateur Normal"), new XElement("PasElement", "Utilisateur"))); IEnumerable<XElement> test = from i in doc.Descendants("Element") select i; foreach (XElement e in test) { Console.WriteLine(e +"\n"); } Console.Read();

VB.NET
Dim doc As XDocument = <?xml version="1.0" encoding="utf-8"?> <Racine> <Element special="Admin">Utilisateur Admin</Element> <Element>Utilisateur Normal</Element> <PasElement>Utilisateur</PasElement> </Racine>

Dim test As IEnumerable(Of XElement) = From i In doc.Descendants("Element") _ Select i For Each e In test Console.WriteLine(e.ToString() + vbNewLine) Next Console.Read()

Voici le rsultat de ces requtes :

Dotnet France Association

10

Chapitre 04 - LINQ to XML

Explication : Tout dabord, nous instancions un XDocument dans lequel nous crons une arborescence XML contenant des donnes. Cela va nous permettre dtablir des requtes sur celui-ci. Ensuite, nous crons un objet qui contient la requte. Enfin nous procdons un affichage des donnes grce un foreach . Revenons sur la requte pour un petit rappel. Llment suivant le mot-cl From correspond la variable qui sera utilise comme alias pour la source de donnes. Le mot-cl In dfini la source de donnes contenant les informations souhaites. Dans notre cas, la source de donnes est compose des descendants du document (tous les nuds du document) qui ont pour nom Element . Nous pouvons constater que le nud sappelant PasElement na pas t pris en compte par la requte et ne saffiche pas dans la console. Le mot-cl Select permet de dfinir ce que lon veut slectionner et donc retourner. Ici, nous voulons la valeur i de type IEnumerable de XElement . Voici une nouvelle requte sur un autre lment quun XDocument : En dfinitif, cela revient effectuer une requte classique que nous allons formater en XML et que nous stockerons dans un XDocument .
C#

XDocument doc = new XDocument( new XElement("Utilisateurs", from util in bdd.Utilisateur select new XElement("Utilisateur", new XAttribute("ID", util.ID), new XElement("Nom", util.Nom), new XElement("Prenom", util.Prenom))));

Remarque : Il nexiste aucun quivalent en VB.NET. Explication : Dans un premier temps, nous crons un document XML laide de linstruction new . Ensuite, le premier lment de ce document doit tre un nud racine. XElement attend comme argument le nom dun nud puis son contenu. Dans notre code, nous effectuons une requte LINQ afin de rcuprer des valeurs pour nos nuds suivants et les rattacher au nud parent (qui est le nud racine). Ces donnes peuvent provenir de toute source de donnes interrogeables avec LINQ. Dans la requte ci-dessus, on rcupre une table Utilisateur dans son intgralit et on cre un alias sur la table qui sappelle util . Notre requte se termine par un Select new XElement permettant de rcuprer les donnes sous ce mme type la place dun tableau classique. Nous crons ainsi larborescence du fichier XML. Les informations de la source de donnes sont stockes dans des XElements avec leur XAttribute . Ils seront donc identifiables par des ID.

Remarque : Il est aussi possible de rcuprer cela dans un XElement plutt quun XDocument . Cela peut permettre par exemple de lajouter dans un document XML dj existant.

Dotnet France Association

11

Chapitre 04 - LINQ to XML

5 Exemples
Dans cette partie, nous prsentons quelques exemples dutilisation de LINQ to XML. Nous ralisons notre premier exemple en utilisant un XDocument .
C#
XDocument doc = new XDocument( new XElement("Racine", new XElement("Utilisateur", new XAttribute("Recherche","Trouv")), new XElement("UtilisateurAvecEnfant", new XElement("Utilisateur","Enfant", new XAttribute("Recherche", "Perdu"))), new XElement("Utilisateur", new XAttribute("Recherche","Perdu"), "Contenu du noeud"))); Console.WriteLine(doc); //On peut l'afficher pour vrifier si sa fonctionne

VB.NET
Dim doc As XDocument = <?xml version="1.0" encoding="utf-8"?> <Racine> <Utilisateur Recherche="Trouv"/> <UtilisateurAvecEnfant> <Utilisateur Recherche="Perdu">Enfant</Utilisateur> </UtilisateurAvecEnfant> <Utilisateur Recherche="Perdu"/> </Racine> Console.WriteLine(doc)

Voici le rsultat de laffichage de ce code :

Nous allons maintenant crer une requte permettant de rcuprer le nud correspondant un Utilisateur qui a lattribut Recherche avec la valeur Trouv .

Dotnet France Association

12

Chapitre 04 - LINQ to XML

C#
IEnumerable<XElement> requete = from d in doc.Root.Descendants() where d.Name == "Utilisateur" && d.Attribute("Recherche").Value == "Trouv" select d;

VB.NET
Dim requete As IEnumerable(Of XElement) = From d In doc.Root.Descendants() _ Where d.Name = "Utilisateur" _ And d.Attribute("Recherche").Value = "Trouv" _ Select d

Limage ci-contre illustre le rsultat retourn par cette commande si nous laffichons. Si nous retirons la deuxime condition, il y a deux nuds Utilisateur pris en compte par la requte.

Dotnet France Association

13

Chapitre 04 - LINQ to XML Lexemple suivant est un peu plus complet. En effet, nous utiliserons deux documents XML afin de montrer un peu plus les capacits de LINQ to XML.
C#
XDocument doc = new XDocument( new XElement("Racine", new XElement("Utilisateur", new XAttribute("id","0")), new XElement("UtilisateurAvecEnfant", new XAttribute("id", "1")), new XElement("Utilisateur", new XAttribute("id","0")))); XDocument doc2 = new XDocument( new XElement("Racine", new XElement("Manager", new XAttribute("id", "0")), new XElement("Stagiaire", new XAttribute("id", "1")))); IEnumerable<XElement> requete = from d in doc.Root.Descendants() from d2 in doc2.Root.Descendants() where d.Attribute("id").Value == d2.Attribute("id").Value select new XElement("Utilisateur", d2.Name); foreach (XElement e in requete) { Console.WriteLine(e); }

VB.NET
Dim doc As XDocument = <?xml version="1.0" encoding="utf-8"?> <Racine> <Utilisateur id="0"/> <UtilisateurAvecEnfant id="1"/> <Utilisateur id="0"/> </Racine> Dim doc2 As XDocument = <?xml version="1.0" encoding="utf-8"?> <Racine> <Manager id="0"/> <Stagiaire id="1"/> </Racine> Dim requete As IEnumerable(Of XElement) = From d In doc.Root.Descendants() _ From d2 In doc2.Root.Descendants() _ Where d.Attribute("id").Value = d2.Attribute("id").Value _ Select New XElement("Utilisateur", d2.Name) For Each e In requete Console.WriteLine(e) Next

Dotnet France Association

14

Chapitre 04 - LINQ to XML Le rsultat de la requte est affich cicontre. La cration de document XML ayant t dj vue prcdemment, nous passons cette partie du code. La requte, quant elle, est plus intressante analyser. Pour les deux documents crs, nous rcuprons le nud racine ainsi que ses descendants grce linstruction doc.Root.Descendants() . Llment ainsi rcupr est une collection de XElement contenant respectivement les utilisateurs et les statuts. Dans le premier document XML, nous pouvons remarquer un id qui est, grce notre requte, li un id correspondant au deuxime document, dans le but de rcuprer le statut de chaque utilisateur. Pour effectuer cela, nous avons utilis deux instructions From , mais nous aurions pu trs bien opter pour lutilisation de linstruction Join qui aurait produit le mme rsultat. Linstruction Where juste aprs nous permet de crer la liaison entre les id des deux documents XML. Enfin, nous utilisons linstruction Select afin de spcifier les informations que lon souhaite que la requte nous retourne. Pour chaque Utilisateur et Statut avec un id quivalent, nous demandons un nouveau XElement ayant pour nom Utilisateur et pour valeur le nom du statut de celui-ci. Pour laffichage, nous excutons un foreach qui parcourra le IEnumerable renvoy par la requte afin dafficher chacune des valeurs contenues dans celui-ci.

Dotnet France Association

15

Chapitre 04 - LINQ to XML

6 Conclusion
Ce chapitre sur LINQ to XML aborde les notions essentielles sur la manipulation de documents XML dans vos projets Windows Form ou Web Form. Il vous sera aussi utile de prendre connaissance des chapitres Introduction au LINQ , LINQ to Objects et XML (ADO.NET) dans les chapitres Windows Form. Les mots-cls de LINQ vous permettront dtablir toute sorte de rcupration de donnes sur des documents XML en utilisant les mthodes et proprits des classes prsentes dans ce chapitre. Plus dinformation sur MSDN : http://msdn.microsoft.com/fr-fr/library/system.xml.linq.aspx

Dotnet France Association

Você também pode gostar