Escolar Documentos
Profissional Documentos
Cultura Documentos
Version 1.1
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
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 :
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 .
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.
Descendants
DocumentType Elements
Load
Nodes
RemoveNodes ReplaceNodes
Root Save
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
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
SetAttributeValue
SetElementValue
Value
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()
10
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.
11
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)
Nous allons maintenant crer une requte permettant de rcuprer le nud correspondant un Utilisateur qui a lattribut Recherche avec la valeur Trouv .
12
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.
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
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.
15
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