2009-09-18 12 views
7

Soy un programador de C#, así que no aprovecho la excelente sintaxis XML en VB.¿Soy solo yo? Creo que LINQ to XML es algo engorroso, en comparación con XPath

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

con C#, encuentro XPath a ser más fácil que pensar, más fácil de código, más fácil de entender, que la realización de una multi-anidado de selección utilizando LINQ to XML. Mira esta sintaxis, parece que jurar griego:

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 
      }; 

Todo el casting, la sintaxis pesada, la posibilidad de que NullPointerExceptions. Nada de esto sucede con XPath.

Me gusta LINQ en general, y lo uso en colecciones de objetos y bases de datos, pero mi primera vuelta con consultar XML me llevó de vuelta a XPath.

¿Soy solo yo?

¿Echo de menos algo?


EDITAR: alguien votó para cerrar esto como "no es una cuestión real". Pero es una pregunta real, declarada claramente. La pregunta es: ¿Estoy malentendido algo con LINQ to XML?

+2

Sí, eres solo tú.: p –

+2

Estoy de acuerdo, me encanta L2O, L2S, etc. pero cuando se trata de xml me limito a utilizar xpath junto con xmldocument/xmlnode/xmlelement etc. Linq-to-XML es quizás más fácil de usar pero si tiene xpath en tus dedos, entonces no va a vencer a xpath ... – KristoferA

+3

No, no eres solo tú. Linq-to-XML podría parecer un enfoque "más inteligente", pero como usted, todavía prefiero XPath. Si conoce XPath y puede usarlo, ¡por supuesto, hágalo! :-) No estás solo :-) –

Respuesta

4

Use con qué se siente más cómodo, siempre que haga el trabajo. Utilizo ambos métodos según lo que necesite hacer con XML. Me parece que tienes una buena idea de lo que LINQ es bueno y de lo que XPath es bueno.

5

Sí, el ejemplo que ha dado es poco amable.

Pero con LINQ viene la flexibilidad para refactorizar la falta de educación.

Aquí hay un ejemplo de cómo podría mejorarlo. (Esto se hace sin ninguna prueba en absoluto, y yo ni siquiera saben los nombres reales de clase, pero debe transmitir la idea)

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

Todavía es mucho más engorroso que una elegante expresión XPath. –

+0

@DimitreNovatchev Me encantaría ver su elegante expresión xpath que devuelve la colección anterior. –

+0

@TimJarvis: me gustaría proporcionar uno. ¿Podría especificar el documento XML y qué nodos deberían seleccionarse exactamente? Estos no se proporcionan en la respuesta anterior, lo que hace que cuelgue aún más en el aire. –

1

supongo a algunos de los tipos de datos, pero se puede hacer su consulta LINQ C# concisa echando sus valores de atributo:

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") 
    }; 

Y estoy seguro de que ya conoce la sintaxis @ puede utilizar para los atributos en los literales XML de VB.

+0

Todavía es mucho más engorroso que una elegante expresión XPath –

+0

Ha pasado un tiempo desde que he tratado directamente con XPath (y no lo uso con Linq a Xml), pero un ejemplo de la expresión XPath 'más simple' sería genial . Personalmente, creo que este ejemplo se ve muy bien, y es cómo normalmente hago las cosas. –

+0

@ Ryan-Versaw Me encantaría proporcionar una expresión XPath (ya sea XPath 1.0 o XPath 2.0), si hay un documento XML específico proporcionado y si hay una descripción estricta de qué resultado debe producirse. –

1

puedo ver su problema pero LINQ utilizado por sólo reordenar un archivo GPX para obtener puntos de ruta en todos los segmentos en el orden correcto y se siente más sencillo .....

 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); 
     } 

y también fijan un error en un archivo GPX entregado por el tiempo

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; 
    } 

Creo que es bastante sencillo formato ....

(El problema que fija http://www.everytrail.com/forum/viewtopic.php?f=4&t=1980&p=6447#p6447)

Cuestiones relacionadas