Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Bidou's Blog

Actualité informatique
(Blog de Nicolas Biedermann)
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

- Silverlight 3 : Communication et multicast par Kévin Gosse le il y a 9 heures et 41 minutes

- [Perso] Découvertes estivales : Linux (Part I) par Le blog de FremyCompany le il y a 12 heures et 23 minutes

- [Refactoring] ReSharper pour Visual Studio 2010 (Preview) par Thomas Jaskula le 07-04-2009, 00:50

- [Refactoring] Analyser vos exceptions avec ReSharper Exceptional par Thomas Jaskula le 07-03-2009, 23:36

- SharePoint 2007 : patterns & practices SharePoint Guidance par Philippe Sentenac [MVP SharePoint] le 07-03-2009, 09:56

- [Visual Studio 2010] Les tests cases c’est bien, mais je vais devoir tout réécrire ? par Etienne Margraff le 07-03-2009, 09:00

- MVP[Gribouillon].AddYear par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le 07-03-2009, 08:45

- Clinique INSIA - Projet de fin d’Etudes (Silverlight 3 MVVM et OutOfBrowser, WCF, TFS) - Part 1 par David REI le 07-02-2009, 23:38

- C’est la crise ? Bah pourquoi cramer du budget pub alors ? par Nix's Blog le 07-02-2009, 15:31

- Soyons MVP ! par TheSaib .NET blog le 07-02-2009, 12:15