.net 只是我吗?与XPath相比,我发现LINQ到XML有点麻烦
我是一名C#程序员,所以我不能利用VB中很酷的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") 所有的强制
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;
}