2009-09-18 3 views
7

Je suis un programmeur C#, donc je ne profite pas de la syntaxe XML sympa dans VB.Est-ce juste moi? Je trouve que LINQ to XML est un peu lourd, comparé à XPath

Dim itemList1 = From item In rss.<rss>.<channel>.<item> _ 
       Where item.<description>.Value.Contains("LINQ") Or _ 
         item.<title>.Value.Contains("LINQ") 

utilisant C#, je trouve XPath être plus facile de penser, plus facile à coder, plus facile à comprendre, que d'effectuer une sélection multi-imbriquée à l'aide LINQ to XML. Regardez cette syntaxe, il ressemble à jurer grec:

var waypoints = from waypoint in gpxDoc.Descendants(gpx + "wpt") 
      select new 
      { 
      Latitude = waypoint.Attribute("lat").Value, 
      Longitude = waypoint.Attribute("lon").Value, 
      Elevation = waypoint.Element(gpx + "ele") != null ? 
       waypoint.Element(gpx + "ele").Value : null, 
      Name = waypoint.Element(gpx + "name") != null ? 
       waypoint.Element(gpx + "name").Value : null, 
      Dt = waypoint.Element(gpx + "cmt") != null ? 
       waypoint.Element(gpx + "cmt").Value : null 
      }; 

Toute la coulée, la syntaxe lourde, la possibilité pour NullPointerExceptions. Rien de tout cela ne se passe avec XPath. J'aime LINQ en général, et je l'utilise sur les collections d'objets et les bases de données, mais ma première tentative d'interrogation de XML m'a ramené à XPath.

Est-ce juste moi?

Ai-je raté quelque chose?


EDIT: quelqu'un a voté pour fermer cette "non une vraie question". Mais il est une vraie question, a déclaré clairement. La question est: Suis-je mal comprendre quelque chose avec LINQ to XML?

+2

Ouais, c'est juste toi.: p –

+2

Je suis d'accord, j'aime L2O, L2S etc. mais quand je traite xml, je me contente d'utiliser xpath avec xmldocument/xmlnode/xmlelement etc. Linq-to-XML est peut-être plus facile à utiliser, mais si vous avez xpath dans tes doigts alors il ne battra pas xpath ... – KristoferA

+3

Non, ce n'est pas seulement toi. Linq-to-XML peut sembler une approche plus "intelligente", mais comme vous, je préfère toujours XPath. Si vous connaissez XPath et que vous pouvez en faire usage - par tous les moyens, faites-le! :-) Vous n'êtes pas seul :-) –

Répondre

4

Utilisez ce que vous sentez le plus à l'aise, tant que le travail est fait. J'utilise les deux méthodes en fonction de ce que je dois faire avec XML. Il me semble que vous avez une bonne idée de ce que LINQ est bon et de ce que XPath est bon pour.

5

Oui, l'exemple que vous avez donné est non-suffisant.

Mais avec LINQ vient la flexibilité de refactoriser la non-satisfaction.

Voici un exemple de comment je l'améliorerais. (Cela se fait sans test du tout, et je ne sais même pas les vrais noms de classe, mais il doit transmettre l'idée)

static class LinqXmlExtension 
{ 
    public static NodeThingy ElementOrNull(this XmlElement ele, string searchString) 
    { 
     return (ele.Element(searchString) != null ? ele.Element(searchString).Value : null); 
    } 
} 

// 
///////////////////////////////////////////////////////////////// 

var waypoints = from waypoint in gpxDoc.Descendants(gpx + "wpt")   
       select new   
       {    
         Latitude = waypoint.Attribute("lat").Value,    
         Longitude = waypoint.Attribute("lon").Value, 
         Elevation = waypoint.ElementOrNull(gpx + "ele"), 
         Name  = waypoint.ElementOrNull(gpx + "name"), 
         Dt  = waypoint.ElementOrNull(gpx + "cmt")   
       }; 
+0

Il est encore beaucoup plus encombrant qu'une élégante expression XPath. –

+0

@DimitreNovatchev J'aimerais voir votre élégante expression xpath qui renvoie la collection ci-dessus. –

+0

@TimJarvis: J'aimerais en fournir une - pourriez-vous, s'il vous plaît, spécifier le document XML et quels nœuds exactement devraient être sélectionnés? Ceux-ci ne sont pas fournis dans la réponse ci-dessus, ce qui le rend encore plus suspendu dans les airs. –

1

Je devine à certains de vos types de données, mais vous pouvez faire votre C# LINQ requête concise en jetant vos valeurs d'attributs:

var waypoints = 
    from waypoint in gpxDoc.Descendants(gpx + "wpt") 
    select new 
    { 
     Latitude = (decimal)waypoint.Attribute("lat"), 
     Longitude = (decimal)waypoint.Attribute("lon"), 
     Elevation = (decimal?)waypoint.Element(gpx + "ele"), 
     Name = (string)waypoint.Element(gpx + "name"), 
     Dt = (DateTime?)waypoint.Element(gpx + "cmt") 
    }; 

Et je suis sûr que vous connaissez déjà la syntaxe @ vous pouvez utiliser pour les attributs dans les littéraux XML de VB.

+0

Il est encore beaucoup plus encombrant qu'une expression XPath élégante –

+0

Ça fait un petit moment que j'ai traité directement avec XPath (et non pas avec Linq à Xml), mais un exemple de l'expression XPath 'plus simple' serait génial . Personnellement, je pense que cet exemple est superbe, et c'est comme ça que je fais les choses normalement. –

+0

@ Ryan-Versaw J'aimerais proposer une expression XPath (XPath 1.0 ou XPath 2.0), si un document XML spécifique est fourni et s'il y a une description stricte du résultat qui doit être produit. –

1

Je peux voir votre problème mais j'utilisé LINQ pour juste réordonner un fichier GPX pour obtenir trackpoints dans tous les segments dans l'ordre correct et il se sent plutôt en avant droit .....

 var trksegs = doc.Root.Descendants(ns + "trkseg"); 
     foreach (var trkseg in trksegs) 
     { 
      List<XElement> trk = trkseg.Elements(ns + "trkpt") 
       .OrderBy(x => (string)x.Element(ns + "time")).ToList(); 
      trkseg.RemoveAll(); 
      trkseg.Add(trk); 
     } 

et aussi fixer un bogue dans un fichier GPX livré pour le temps

private static XDocument ConvertTimeElement(XDocument doc) 
    { 
     if (doc.Root != null) 
     { 
      var times = doc.Root.Descendants(ns + "time").ToList(); 
      foreach (var time in times) 
       time.SetValue((string)ConvertSpotDateFormat(time)); 
     } 
     return doc; 
    } 

Je pense qu'il est plutôt le format droit ....

(Le problème que je fixe http://www.everytrail.com/forum/viewtopic.php?f=4&t=1980&p=6447#p6447)