Calendrier

Décembre 2009
L M M J V S D
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
<< < > >>

Présentation

Recherche

W3C

  • Flux RSS des articles

Linq To Xml

[ Linq To Xml ] – Quelques points
 
<?xml   version="1.0" encoding="utf-8" standalone="yes"?>
<!-- un commentaire -->
<?xml-stylesheet type="text/xsl" href="Contacts.xslt"?>
<Contacts>
 <Contact genre="Amis">
    <ContactID>1</ContactID>
    <ContactName>Dupond</ContactName>
    <ContactFirstName>éric</ContactFirstName>
    <ContactEmail>edupond@hotmail.com</ContactEmail>
 </Contact>
 <Contact genre="Famille">
    <ContactID>2</ContactID>
    <ContactName>Bellin</ContactName>
    <ContactFirstName>marie</ContactFirstName>
    <ContactEmail>mb@hotmail.com</ContactEmail>
 </Contact>
 <Contact>
    <ContactID>3</ContactID>
    <ContactName>Martin</ContactName>
    <ContactFirstName>jacques</ContactFirstName>
    <ContactEmail>jm@hotmail.com</ContactEmail>
 </Contact>
</Contacts>
 
I Petit tour d’horizon
Un XDocument récupère l’ensemble du document XML (déclaration,xprocessinginstruction,etc.)
Un XElement ne récupère que le root (pas la déclaration)
 
System.Xml.Linq.XDocument oXDocument = System.Xml.Linq.XDocument.Load(@"C://Documents and Settings//romagny//Mes documents//Access//XML//Contacts.xml");
 
System.Xml.Linq.XElement oXElement = System.Xml.Linq.XElement.Load(@"C://Documents and Settings//romagny//Mes documents//Access//XML//Contacts.xml");
 
Ø Les methods Parse,ReadFrom permettent également de charger un document Xml
 
A noter on peut parfaitement intégrer Load avec un select par exemple
            IEnumerable<XElement> Query = XElement.Load(oOpenFileDialog.FileName).Elements().Select<XElement, XElement>(delegate(XElement el)
            {
                return el;
            });
 
1 Déclaration
 // recupèrer la déclaration >> <?xml version="1.0" encoding="utf-8" standalone="yes"?>
            System.Xml.Linq.XDeclaration oXDeclaration = oXDocument.Declaration;
          
            string encoding = oXDocument.Declaration.Encoding;
            string version = oXDocument.Declaration.Version;
            string standalone = oXDocument.Declaration.Standalone;
Créer l’XDeclaration du document
System.Xml.Linq.XDocument oXDocument = new System.Xml.Linq.XDocument(new System.Xml.Linq.XDeclaration("1.0", "utf-8", "yes"));
 
2 Récupération du root
            // sélection element root
            System.Xml.Linq.XElement oXElement = oXDocument.Root;
            // ou
            System.Xml.Linq.XElement oXElement = oXDocument.Element("Contacts") ;
 
3 Attributs
// selection de tous les attributs de l’element
var Query =
                from xa in oXDocument.Root.Elements("Contact").ElementAt(0).Attributes()
                select xa;
 
            IEnumerable<System.Xml.Linq.XAttribute> Query = this.oXDocument.Root.Elements("Contact").ElementAt<System.Xml.Linq.XElement>(0).Attributes().Select<System.Xml.Linq.XAttribute, System.Xml.Linq.XAttribute>(delegate(System.Xml.Linq.XAttribute xa)
            {
                return xa;
            });
 
 
 
// selection d’un attribut spécifique de l’element
                  var Query = oXDocument.Root.Elements("Contact").ElementAt(0).Attribute("genre");
 
            System.Xml.Linq.XAttribute Query = this.oXDocument.Root.Elements("Contact").ElementAt<System.Xml.Linq.XElement>(0).Attribute("genre");
 
4 Namespaces
Ø Lecture
// récupérer les namespaces
            List<System.Xml.Linq.XNamespace> LstXNamespaces = new List<System.Xml.Linq.XNamespace>();
 
            foreach (System.Xml.Linq.XElement oXElement in oXDocument.Root.DescendantsAndSelf())
            {
                if (!LstXNamespaces.Contains(oXElement.Name.Namespace) && oXElement.Name.Namespace != System.Xml.Linq.XNamespace.Blank && oXElement.Name.Namespace != System.Xml.Linq.XNamespace.Xml && oXElement.Name.Namespace != System.Xml.Linq.XNamespace.Xmlns)
                {
                    LstXNamespaces.Add(oXElement.Name.Namespace);
                }
                foreach (System.Xml.Linq.XAttribute oXAttribute in oXElement.Attributes())
                {
                    if (!LstXNamespaces.Contains(oXAttribute.Name.Namespace) && oXAttribute.Name.Namespace != System.Xml.Linq.XNamespace.Blank && oXAttribute.Name.Namespace != System.Xml.Linq.XNamespace.Xml && oXAttribute.Name.Namespace != System.Xml.Linq.XNamespace.Xmlns)
                    {
                        LstXNamespaces.Add(oXAttribute.Name.Namespace);
                    }
                }
            }
 
Voir si un attribut est une déclaration de namespace > propriété IsNamespaceDeclaration à true
Récupèrer le prefix >> oXAttribute.Name.LocalName > retourne le prefix « xs » par exemple
 
Note : DescendantsAndSelf() effectue une récursive
Ø Création de XElement avec XNamespace
             // simple <NomBalise>valeur</NomBalise>
             oXElement = new System.Xml.Linq.XElement("NomBalise", "valeur");
 
            // avec XNamespace <NomBalise xmlns="http://www.monnamespace.com">Valeur</NomBalise>
            System.Xml.Linq.XNamespace oXNamespace = "http://www.monnamespace.cm";
            oXElement = new System.Xml.Linq.XElement(oXNamespace + "NomBalise", "Valeur");
            // > inclure le namespace à tous les XElement l'utilisant
 
 
            // Prefix + XNamespace
            // <xs:NomBalise xmlns:xs="http://www.monnamespace.com">Valeur</xs:NomBalise>
            System.Xml.Linq.XNamespace oXNamespace = "http://www.monnamespace.com";
            oXElement = new System.Xml.Linq.XElement(oXNamespace + "NomBalise", "Valeur",
                            new System.Xml.Linq.XAttribute(System.Xml.Linq.XNamespace.Xmlns + "xs", oXNamespace)
                            );
 
            // plusieurs balises ayant le même prefix
            // >> ne declarer l'attribut avec le namespace que pour la première balise
            //<xs:NomBalise xmlns:xs="http://www.monnamespace.com">
            // <xs:NomBalise2>Valeurbalise2</xs:NomBalise2>
            // <xs:NomBalise3>Valeurbalise3</xs:NomBalise3>
            //</xs:NomBalise>
            System.Xml.Linq.XNamespace oXNamespace = "http://www.monnamespace.com";
            oXElement = new System.Xml.Linq.XElement(oXNamespace + "NomBalise",
                            new System.Xml.Linq.XAttribute(System.Xml.Linq.XNamespace.Xmlns + "xs", oXNamespace),
                        new System.Xml.Linq.XElement(oXNamespace + "NomBalise2","Valeurbalise2"),
                        new System.Xml.Linq.XElement(oXNamespace + "NomBalise3", "Valeurbalise3")
                            );
 
II RECUPERATION D’UNE VALEUR OU UN ELEMENT EN RESULTAT
Récupération d’un XElement
            var Query =
                (from x in oXDocument.Root.Elements("Contact")
                 select x).First<System.Xml.Linq.XElement>();
            //
            System.Xml.Linq.XElement Query = this.oXDocument.Root.Elements("Contact").Select<System.Xml.Linq.XElement, System.Xml.Linq.XElement>(delegate(System.Xml.Linq.XElement x)
            {
                return x;
            }).First<XElement>();
 
Récupération d’une valeur
             var Query = oXDocument.Root.Elements("Contact").ElementAt(0).Element("ContactName").Value;
            //
            string Query = this.oXDocument.Root.Elements("Contact").ElementAt<System.Xml.Linq.XElement>(0).Element("ContactName").Value;
 
III RECUPERATION D’UNE LISTE EN RESULTAT
-          le résultat est stocké dans IEnumerable<XElement> si pas de « clause «  orderby
si il y a une clause ORDERBY (un trie donc) le résultat est stocké dans un IOrderedSequence<XElement>
-          la clause SELECT n’est pas obligatoire dès l’instant ou il y a une clause where ou orderby
-          les méthodes anonymes sont utilisées pour :
o   where > pour vérifier une condition et renvoyer (true ou false)
o   orderby > pour spécifierla valeur de l’élément (ou attribut) de trie
-          orderby est utilisé pour un trie ascendant(ascending)
-          orderbydescending est utilisé pour un trie décroissant (descending)
SELECT SIMPLE
 
            //selection de tous les contacts
            // il faut donner l'arborescence exacte
            var Query =
                from x in oXDocument.Root.Elements("Contact")
                select x;
            // ou
            IEnumerable<System.Xml.Linq.XElement> Query =
                this.oXDocument.Root.Elements("Contact").Select<System.Xml.Linq.XElement, System.Xml.Linq.XElement>(delegate(System.Xml.Linq.XElement x)
                {
                    return x;
                }
          );
 
AVEC WHERE
var Query =
                from x in oXDocument.Root.Elements("Contact")
                where x.Element("ContactName").Value.StartsWith("B")
                select x;
            // ou
            IEnumerable<System.Xml.Linq.XElement> Query = this.oXDocument.Root.Elements("Contact").Where<System.Xml.Linq.XElement>(delegate(System.Xml.Linq.XElement x)
            {
                return x.Element("ContactName").Value.StartsWith("B");
            });
 
AVEC ORDERBY
// trie sur ContactName
            var Query =
                from x in oXDocument.Root.Elements("Contact")
                orderby x.Element("ContactName").Value ascending
                select x;
            // Ou
            IOrderedSequence<System.Xml.Linq.XElement> Query = this.oXDocument.Root.Elements("Contact").OrderBy<System.Xml.Linq.XElement, string>(delegate(System.Xml.Linq.XElement x)
            {
                return x.Element("ContactName").Value;
            });
 
AVEC WHERE ET ORDERBY
var Query =
                from x in oXDocument.Root.Elements("Contact")
                where x.Element("ContactName").Value.StartsWith("B")
                orderby x.Element("ContactName").Value descending
                select x;
            // ou
            IOrderedSequence<XElement> Query = this.oXDocument.Root.Elements("Contact").Where<XElement>(delegate(XElement x)
            {
                return x.Element("ContactName").Value.StartsWith("B");
            }).OrderByDescending<XElement, string>(delegate(XElement x)
            {
                return x.Element("ContactName").Value;
            });
 
Par Romagny13
Ecrire un commentaire - Voir les commentaires - Recommander
XLinq - Lire un document Xml et stocker les informations dans une couche métier
 
Cet exemple est la réciproque de l’exemple ci – dessous mais montrant cette fois comment charger un document Xml avec XLinq (ou Linq To Xml) et stocker les informations dans la couche métier (ici une collection de contacts)
Un aperçu du fichier Xml (qui a été généré dans exemple précédent)
<?xml version="1.0" encoding="utf-8"?>
<Contacts>
 <Contact>
    <ContactID>1</ContactID>
    <ContactName>Durand</ContactName>
    <ContactFirstName>Paul</ContactFirstName>
    <ContactType>M</ContactType>
 </Contact>
 <Contact>
    <ContactID>2</ContactID>
    <ContactName>Bellin</ContactName>
    <ContactFirstName>Marie</ContactFirstName>
    <ContactType>F</ContactType>
 </Contact>
 <Contact>
    <ContactID>3</ContactID>
    <ContactName>Martin</ContactName>
    <ContactFirstName>Pierre</ContactFirstName>
    <ContactType>M</ContactType>
 </Contact>
 <Contact>
    <ContactID>4</ContactID>
    <ContactName>Lemel</ContactName>
    <ContactFirstName>Julie</ContactFirstName>
    <ContactType>F</ContactType>
 </Contact>
</Contacts>
 
Et voila le code (à mettre dans la form ) qui permet de lire le fichier Xml
 
 
           // Chargement du document Xml
            oXDocument = new System.Xml.Linq.XDocument();
            oXDocument = System.Xml.Linq.XDocument.Load("Contacts.xml");
 
            //
            ContactCollection oContacts;
            oContacts = new ContactCollection();
            //
            foreach (System.Xml.Linq.XElement oXElement in oXDocument.Element("Contacts").Elements("Contact"))
            {
                Contact oContact;
                oContact = new Contact();
                oContact.ContactID = Convert.ToInt32(oXElement.Element("ContactID").Value);
                 oContact.ContactName = oXElement.Element("ContactName").Value;
                oContact.ContactFirstName = oXElement.Element("ContactFirstName").Value;
                oContact.ContactType = oXElement.Element("ContactType").Value;
                //
                oContacts.Add(oContact);
            }
            //Affichage de la liste des contacts dans un datagridview
            dataGridView1.DataSource = oContacts;
 
Ou encore
// Chargement du document Xml
            System.Xml.Linq.XDocument oXDocument;
            oXDocument = new System.Xml.Linq.XDocument();
            oXDocument = System.Xml.Linq.XDocument.Load("Contacts.xml");
 
            //
            ContactCollection oContacts;
            oContacts = new ContactCollection();
            //
 
            //
            var result = from oXElement in oXDocument.Element("Contacts").Elements("Contact")
                         select oXElement;
 
            foreach (System.Xml.Linq.XElement oXElement in result)
            {
                Contact oContact;
                oContact = new Contact();
                oContact.ContactID = Convert.ToInt32(oXElement.Element("ContactID").Value);
                oContact.ContactName = oXElement.Element("ContactName").Value;
                oContact.ContactFirstName = oXElement.Element("ContactFirstName").Value;
                oContact.ContactType = oXElement.Element("ContactType").Value;
                //
                oContacts.Add(oContact);
            }
 
          
            //Affichage de la liste des contacts dans un datagridview
            dataGridView1.DataSource = oContacts;
Par Romagny13
Ecrire un commentaire - Voir les commentaires - Recommander

 

Quelques liens pour XLinq

article sur DotNetGuru.org

http://www.dotnetguru.org/articles/articlets/linq/Linq.htm

Webcasts

http://www.microsoft.com/France/Vision/List.aspx?Qry=xlinq&Did=B2873510-DC97-4F45-B64D-A3DD3C0DB48F&Pid=&Nid=&Cid=&Tid=

et le document word Overview disponible sur (le site dispose de nombreuses ressources)

http://msdn2.microsoft.com/fr-fr/netframework/aa904594.aspx

 

 

Par Romagny13
Ecrire un commentaire - Voir les commentaires - Recommander
XLinq – créer un document Xml à partir de rien avec une couche métier
Collection
using System;
using System.Text;
 
namespace TestXLinq
{
      public class ContactCollection:System.Collections.Generic.List<Contact>
      {
  
    }
}
 
Classe
using System;
using System.Text;
 
namespace TestXLinq
{
   
      public class Contact
      {
            private int m_ContactID;
            private string m_ContactName;
            private string m_ContactFirstName;
            private string m_ContactType;
 
            public Contact()
            {
            }
        public Contact(int ContactID, string ContactName, string ContactFirstName, string ContactType)
        {
            this.ContactID = ContactID;
            this.ContactName = ContactName;
            this.ContactFirstName = ContactFirstName;
            this.ContactType = ContactType;
        }
 
            public int ContactID
            {
                  get { return m_ContactID; }
                  set { m_ContactID = value; }
            }
            public string ContactName
            {
                  get { return m_ContactName; }
                  set { m_ContactName = value; }
            }
            public string ContactFirstName
            {
                  get { return m_ContactFirstName; }
                  set { m_ContactFirstName = value; }
            }
            public string ContactType
            {
                  get { return m_ContactType; }
                  set { m_ContactType = value; }
            }
      }
}
 
 
Test dans la form
// 1 liste de contacts
                ContactCollection oContacts;
                oContacts = new ContactCollection();
 
                oContacts.Add(new Contact(1, "Durand", "Paul", "M"));
                oContacts.Add(new Contact(2, "Bellin", "Marie", "F"));
                oContacts.Add(new Contact(3, "Martin", "Pierre", "M"));
                oContacts.Add(new Contact(4, "Lemel", "Julie", "F"));
 
 
                // 2 sauver
                     System.Xml.Linq.XDocument oXDocument;
                oXDocument = new System.Xml.Linq.XDocument(); // Document
 
                System.Xml.Linq.XElement oXElementContacts;
                oXElementContacts = new System.Xml.Linq.XElement("Contacts"); // root
 
                foreach (Contact oContact in oContacts)
                {
                    System.Xml.Linq.XElement oXElementContact;
                    System.Xml.Linq.XElement oXElementContactID;
                    System.Xml.Linq.XElement oXElementContactName;
                    System.Xml.Linq.XElement oXElementContactFirstName;
                    System.Xml.Linq.XElement oXElementContactType;
 
                    oXElementContact = new System.Xml.Linq.XElement("Contact");
                    oXElementContactID = new System.Xml.Linq.XElement("ContactID", oContact.ContactID.ToString());
                    oXElementContactName = new System.Xml.Linq.XElement("ContactName", oContact.ContactName);
                    oXElementContactFirstName = new System.Xml.Linq.XElement("ContactFirstName", oContact.ContactFirstName);
                    oXElementContactType = new System.Xml.Linq.XElement("ContactType", oContact.ContactType);
 
                    oXElementContact.Add(oXElementContactID);
                    oXElementContact.Add(oXElementContactName);
                    oXElementContact.Add(oXElementContactFirstName);
                    oXElementContact.Add(oXElementContactType);
                    oXElementContacts.Add(oXElementContact);
                   
//>> ou
                    System.Xml.Linq.XElement oXElementContact;
                    oXElementContact = new System.Xml.Linq.XElement("Contact",
                                           new System.Xml.Linq.XElement("ContactID", oContact.ContactID.ToString()),
                                       new System.Xml.Linq.XElement("ContactName", oContact.ContactName),
                                       new System.Xml.Linq.XElement("ContactFirstName", oContact.ContactFirstName),
                                       new System.Xml.Linq.XElement("ContactType", oContact.ContactType)
                                           );
                    oXElementContacts.Add(oXElementContact);
                   
//>> ou encore plus rapide
                    oXElementContacts.Add(new System.Xml.Linq.XElement("Contact",
                                              new System.Xml.Linq.XElement("ContactID", oContact.ContactID.ToString()),
                                              new System.Xml.Linq.XElement("ContactName", oContact.ContactName),
                                              new System.Xml.Linq.XElement("ContactFirstName", oContact.ContactFirstName),
                                              new System.Xml.Linq.XElement("ContactType", oContact.ContactType)
                                              )
                                           );
                   
                }
                oXDocument.Add(oXElementContacts);
 
                oXDocument.Save("Contacts.xml");
 
 
Il existe une méthode plus savante qui tire partie du requetage XLinq et Linq to Objects
// 1 liste de contacts
                ContactCollection oContacts;
                oContacts = new ContactCollection();
 
                oContacts.Add(new Contact(1, "Durand", "Paul", "M"));
                oContacts.Add(new Contact(2, "Bellin", "Marie", "F"));
                oContacts.Add(new Contact(3, "Martin", "Pierre", "M"));
                oContacts.Add(new Contact(4, "Lemel", "Julie", "F"));
 
 
                // 2 sauver
                     System.Xml.Linq.XDocument oXDocument;
                oXDocument = new System.Xml.Linq.XDocument(); // Document
 
                System.Xml.Linq.XElement oXElementContacts;
                oXElementContacts = new System.Xml.Linq.XElement("Contacts"); // root
              
                oXElementContacts.Add(from oContact in oContacts
                               select new System.Xml.Linq.XElement(new System.Xml.Linq.XElement("Contact",
                                                            new System.Xml.Linq.XElement("ContactID", oContact.ContactID.ToString()),
                                                            new System.Xml.Linq.XElement("ContactName", oContact.ContactName),
                                                            new System.Xml.Linq.XElement("ContactFirstName", oContact.ContactFirstName),
                                                            new System.Xml.Linq.XElement("ContactType", oContact.ContactType)
                                                            )
                                                         ));
 
 
                oXDocument.Add(oXElementContacts);
                oXDocument.Save("Contacts.xml");
 
 
Par Romagny13
Ecrire un commentaire - Voir les commentaires - Recommander
Créer un blog sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus