.net 只是我吗?与XPath相比,我发现LINQ到XML有点麻烦

.net 只是我吗?与XPath相比,我发现LINQ到XML有点麻烦,.net,linq,xpath,linq-to-xml,.net,Linq,Xpath,Linq To Xml,我是一名C#程序员,所以我不能利用VB中很酷的XML语法 Dim itemList1 = From item In rss.<rss>.<channel>.<item> _ Where item.<description>.Value.Contains("LINQ") Or _ item.<title>.Value.Contains("LINQ") 所有的强制

我是一名C#程序员,所以我不能利用VB中很酷的XML语法

Dim itemList1 = From item In rss.<rss>.<channel>.<item> _
                Where item.<description>.Value.Contains("LINQ") Or _
                      item.<title>.Value.Contains("LINQ")
所有的强制转换,繁重的语法,NullPointerException的可能性。这些都不会发生在XPath中

一般来说,我喜欢LINQ,我在对象集合和数据库上使用它,但我第一次使用查询XML时,我又回到了XPath

只是我吗

我错过什么了吗


编辑:有人投票认为这不是一个真正的问题。但这是一个真正的问题,说得很清楚。问题是:我误解了吗
使用LINQ到XML的东西?

使用您觉得最舒服的东西,只要它能完成任务。我使用这两种方法取决于我需要对XML做什么。在我看来,您已经很好地掌握了LINQ的优点和XPath的优点。

是的,您给出的示例不太合适

但LINQ带来了重构消除不适的灵活性

下面是一个我将如何改进它的示例。(这完全没有进行任何测试,我甚至不知道真正的类名,但它应该传达了这个想法)


我在猜测您的一些数据类型,但您可以通过强制转换属性值来简化C#LINQ查询:

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

我相信你已经知道VB的XML文本中属性可以使用的@语法。

我可以看到你的问题,但我使用LINQ对GPX文件进行重新排序,以便以正确的顺序获得每个段中的轨迹点,感觉相当直接

       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);
        }
我认为这是一个相当直接的格式


(我解决了这个问题)

我同意,我喜欢L2O、L2S等,但在处理xml时,我会退回到使用xpath和xmldocument/xmlnode/xmlelement等。Linq到xml可能更容易入门,但如果你手中有xpath,它就不会打败xpath……不,不仅仅是你。Linq到XML似乎是一种“更聪明”的方法,但和您一样,我仍然更喜欢XPath。如果您知道XPath并能使用它,请务必这样做!:-)不止你一个人:-)对于你来说,新的东西似乎没有你已经知道的那么明显,这并不奇怪。它仍然比优雅的XPath表达式麻烦得多。@DimitreNovatchev我希望看到你优雅的XPath表达式返回上述集合。@TimJarvis:我想提供一个-,你能,请指定XML文档以及应该选择哪些节点?上面的答案中没有提供这些,这使得它更加悬而未决。它仍然比优雅的XPath表达式麻烦得多。我已经有一段时间没有处理直接的XPath了(并且没有将它与Linq to Xml一起使用),但是一个“更简单”的XPath表达式的示例将非常好。就我个人而言,我认为这个例子看起来很棒,这也是我通常的做法。@Ryan Versaw我希望提供一个XPath表达式(无论是XPath 1.0还是XPath 2.0),前提是提供了特定的XML文档,并且对必须生成的结果有严格的描述。
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")
    };
       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);
        }
  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;
    }