Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide
XPath avec C#
Je présente juste un petit teste sur XPath que j'ai fait dans le cadre de ce tutorial qui pourra peut-être intéresser quelques personnes.
Contenu du fichier XML sur lequel on effectue la requête:

<?xml version="1.0" ?>
<CodeS-SourceS>
         
<csharpfr code="1080">
               
<Sources>
                     <Source name="XML, XPath" url="x.aspx">
                           <Rating>8</Rating>
                           <Author>Bidou</Author>
                           <Visit>8343</Visit>
                           <Updates>
                              <Update Date="15.02.2005">Correction d'un bug</Update>
                           </Updates>
                     </Source>
                     <Source name="Tuto XNA" url="y.aspx">
                           <Rating>8.5</Rating>
                           <Author>Mx</Author>
                           <Visit>5241</Visit>
                     </Source>
                     <
Source name="Interop" url="z.aspx">
                           <
Rating>10</Rating>
                           <Author>Lutinore</Author>
                           <Visit>12541</Visit>
               </Source>
               </
Sources>
               <Tutos>
                     
<Source name="CrossThreading" url="a.aspx">
                           
<Rating>9</Rating>
                           
<Author>Mx</Author>
                           
<Visit>15241</Visit>
                           
<Updates>
                                 
<Update Date="22.05.2006">Mise en forme</Update>
                                 
<Update Date="23.05.2006">Re Mise en forme</Update>
                                 
<Update Date="24.05.2006">Re re Mise en forme !</Update>
                           
</Updates>
                     
</Source>
               
</Tutos>
         
</csharpfr>
         
<vbfrance code="10345">
               
<Sources>
                     
<Source name="RegEx" url="s.aspx">
                           
<Rating>8.4</Rating>
                           
<Author>Seb</Author>
                           
<Visit>8821</Visit>
                           
<Updates>
                                 
<Update Date="02.02.2004">Ajout d'une option</Update>
                                 
<Update Date="02.03.2004">Et le Coq alors !?</Update>
                                 
<Update Date="02.03.2004">Cocorico !</Update>
                           
</Updates>
                     
</Source>
                     
<Source name="Thread" url="f.aspx">
                           
<Rating>5</Rating>
                           
<Author>Mx</Author>
                           
<Visit>1241</Visit>
                           
<Updates>
                                 
<Update Date="22.05.2006">Euh, oui ?</Update>
                           
</Updates>
                     
</Source>
               
</Sources>
               
<Tutos>
                     
<Source name="VS 2005" url="r.aspx">
                           
<Rating>9.3</Rating>
                           
<Author>Coq</Author>
                           
<Visit>16321</Visit>
                           
<Updates>
                                 
<Update Date="17.04.2004">Ajout commentaire</Update>
                           
</Updates>
                     </Source>
                     
<Source name="Codyx" url="l.aspx">
                           
<Rating>8.9</Rating>
                           
<Author>Nix</Author>
                           
<Visit>10005</Visit>
                     
</Source>
               
</Tutos>
         </vbfrance>
</CodeS-SourceS>


Requête à effectuer : retourner les auteurs de codes sources ayant posté une source avec au moins deux mises à jour dont la dernière en 2005 ou après ainsi qu’un minimum de 10'000 visites ou une note plus grande ou égal à 9.

  • Solution avec XPath

            XPathDocument xPathDoc = new XPathDocument("CS.xml");

            XPathNavigator xPathNav = xPathDoc.CreateNavigator();

 

            string visitsOrRating = "((Visit>10000) or (Rating>=9))";

            string lastUpdate = "(*/Update[last()][(substring(@Date, 7) > 2004)])";

            string nbUpdate = "(count(*/Update) > 1)";

            string xPathExp = string.Format("//Source[{0} and {1} and {2}]/Author", visitsOrRating, lastUpdate, nbUpdate);

            XPathNodeIterator authors = xPathNav.Select(xPathNav.Compile(xPathExp));


  • Solution "standard"

            XmlDocument xDoc = new XmlDocument();

            xDoc.Load("CS.xml");

            List<string> result = new List<string>();

            
foreach (XmlElement xElementSite in xDoc.DocumentElement)

            {

               foreach (XmlNode xNodeSources in xElementSite.ChildNodes)

               {

                  foreach (XmlNode xNodeSource in xNodeSources.ChildNodes)

                  {

                     int visit = 0;

                     Int32.TryParse(xNodeSource["Visit"].InnerText, out visit);

                     double rating = 0;

                     Double.TryParse(xNodeSource["Rating"].InnerText, out rating);

 

                     if (visit > 10000 || rating >= 9)

                     {

                        XmlElement updates = xNodeSource["Updates"];

                        if (updates != null && updates.ChildNodes.Count > 1)

                        {

                           string yearStr = updates.LastChild.Attributes["Date"].Value;

                           int year = 0;

                           Int32.TryParse(yearStr.Split('.')[2], out year);

                           if (year > 2004) result.Add(xNodeSource["Author"].InnerText);

                        }

                     }

                  }

               }

            }


Résultat

Par solution standard, j'entends une solution que l'ont pourrait mettre en oeuvre si on ne connaît pas l'existence d'XPath ou qu'on sous-estime ses possibilités. Certainement qu'il est possible de faire un code meilleur et plus performant que celui que je propose ci-dessus, mais il sera certainement plus complexe et toujours bien moins rapide qu'un petit XPath !

La StopWatch pour mesurer le temps est enclenchée juste avant le Select pour le premier cas, et juste avant le premier foreach pour le second.
Les chiffres dans le tableau plus bas sont une moyenne de plusieurs testes, ils représentent le nombre de Ticks écoulés.


 

Taille du fichier – nombre de match

Xpath

Standard

Coef

3Ko – 1

42’408

76’488

1.8

157Ko – 1

46’864

3’667’252

78

242Ko – 90

47’796

5'257’592

110

425Ko – 90

46’964

9’356’804

203

6170Ko – 15’228

50’988

134’623’548

2640

Le résultat est sans appel...

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: jeudi 19 octobre 2006 22:54 par Bidou
Classé sous : , ,

Commentaires

cyril a dit :

Héhé, sympa comme test :-)

Pour faciliter l'écriture des requetes XPath on peut se servir de l'excellent outil XPathBuilder : http://blogs.developpeur.org/cyril/archive/2006/05/03/XPathBuilder-construiser-facilement-vos-requet-XPath.aspx

# octobre 20, 2006 02:28

Bidou a dit :

Ca a l'air sympa ce logiciel ;-)

Faudra que je teste à l'occas'

# octobre 21, 2006 09:31

coq a dit :

Et n'oubliez pas de regarder du côté des requêtes paramétrées aussi hein ^^ : http://blogs.codes-sources.com/coq/archive/2007/03/18/xpath-utilisez-des-requ-tes-param-tr-es.aspx

# mai 18, 2007 09:13
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le il y a 14 heures et 11 minutes

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le il y a 16 heures et 44 minutes

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59

- Perspective 3.0 pour Silverlight 5.0 par Perspective le 02-07-2012, 22:39