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

- [WPF] Comment déclencher un évènement sur un contrôle ? par Thomas Lebrun le il y a 7 minutes

- [Expression Web] Astuce de la Semaine : Utilisation et Configuration des Extraits de Code par Chronos, Blog d'un Intégrateur .NET le il y a 15 heures et 26 minutes

- Faire de l'AJAX sans restrictions de domaine par Kévin Gosse le il y a 17 heures et 55 minutes

- [IronPython] : IronPython & Silverlight 2 - Part II par Kim's Blog le 07-22-2008, 14:50

- [WPF] Des requêtes NDepend pour analyser vos projets WPF par Thomas Lebrun le 07-21-2008, 09:27

- Liste de jeux pour Silverlight par Pierrick's Blog le 07-20-2008, 14:37

- T_PAAMAYIM_NEKUDOTAYIM par MadMatt le 07-19-2008, 16:16

- Et je mets le son.... par Pierrick's Blog le 07-19-2008, 12:09

- SharePoint : Comment interdire l’accès à un utilisateur pour tous les sites d’une Web Application par Blog Technique de Romelard Fabrice le 07-18-2008, 19:05

- VPC - Reset de la position de la console par Blog technique de Nicolas Boonaert le 07-18-2008, 16:29