2009-09-18 22 views
7

Tôi là lập trình viên C#, vì vậy tôi không tận dụng được cú pháp XML thú vị trong VB.Chỉ là tôi? Tôi thấy LINQ to XML là loại cồng kềnh, so với XPath

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

Sử dụng C#, tôi tìm XPath để được dễ dàng hơn để suy nghĩ về, dễ dàng hơn để mã, dễ hiểu, vì thực hiện một đa lồng chọn sử dụng LINQ to XML. Nhìn vào cú pháp này, trông giống như tiếng Hy Lạp chửi thề:

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

Tất cả cú pháp, cú pháp nặng, khả năng cho NullPointerExceptions. Không có điều gì xảy ra với XPath.

Tôi thích LINQ nói chung và tôi sử dụng nó trên bộ sưu tập đối tượng và cơ sở dữ liệu, nhưng vòng đầu tiên của tôi với truy vấn XML đã dẫn tôi quay trở lại XPath.

Chỉ là tôi?

Tôi có thiếu gì đó không?


EDIT: một người nào đó đã bỏ phiếu để đóng này là "không phải là một câu hỏi thực sự". Nhưng nó một câu hỏi thực sự, đã nêu rõ. Câu hỏi là: Tôi có hiểu nhầm điều gì đó với LINQ to XML không?

+2

Yup, đó chỉ là bạn.: p –

+2

Tôi đồng ý, tôi yêu L2O, L2S, nhưng khi giao dịch với xml tôi chỉ cần quay trở lại sử dụng xpath cùng với xmldocument/xmlnode/xmlelement vv. Linq-to-XML có thể dễ dàng hơn để bắt đầu nhưng nếu bạn có xpath trong ngón tay của bạn sau đó nó sẽ không đánh bại xpath ... – KristoferA

+3

Không, nó không chỉ là bạn. Linq-to-XML có vẻ giống như một cách tiếp cận "thông minh hơn", nhưng cũng giống như bạn, tôi vẫn thích XPath hơn. Nếu bạn biết XPath và có thể tận dụng nó - bằng mọi cách, hãy làm như vậy! :-) Bạn không đơn độc :-) –

Trả lời

4

Sử dụng những gì bạn cảm thấy thoải mái nhất, miễn là nó hoàn thành công việc. Tôi sử dụng cả hai phương pháp tùy thuộc vào những gì tôi cần làm với XML. Nghe có vẻ với tôi như bạn đã có một xử lý tốt trên những gì LINQ là tốt cho và những gì XPath là tốt cho.

5

Có, ví dụ bạn đã đưa ra không đáng lo ngại.

Nhưng với LINQ có tính linh hoạt để cấu trúc lại sự bất tiện.

Đây là ví dụ về cách tôi cải thiện nó. (Điều này được thực hiện mà không bất kỳ thử nghiệm ở tất cả, và tôi thậm chí không biết tên lớp thực, nhưng nó phải truyền đạt ý tưởng)

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

Nó vẫn còn rườm rà hơn một biểu thức XPath thanh lịch. –

+0

@DimitreNovatchev Tôi muốn thấy biểu thức xpath thanh lịch của bạn trả về bộ sưu tập ở trên. –

+0

@TimJarvis: Tôi muốn cung cấp một - có thể bạn, vui lòng, chỉ định tài liệu XML và các nút chính xác nào sẽ được chọn? Những điều này không được cung cấp trong câu trả lời ở trên, điều này khiến nó thậm chí còn treo lơ lửng hơn trong không khí. –

1

Tôi đoán ở một số kiểu dữ liệu của bạn, nhưng bạn có thể làm cho truy vấn C# LINQ của bạn ngắn gọn bằng cách truyền các giá trị thuộc tính của bạn:

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

Và tôi chắc chắn bạn đã biết cú pháp @ bạn có thể sử dụng cho các thuộc tính trong VB XML literals.

+0

Nó vẫn còn rườm rà hơn một biểu thức XPath thanh lịch –

+0

Đã một chút thời gian kể từ khi tôi xử lý XPath thẳng (và không sử dụng nó với LINQ to Xml), nhưng một ví dụ về biểu thức XPath 'đơn giản hơn' sẽ tuyệt vời . Cá nhân, tôi nghĩ rằng ví dụ này trông tuyệt vời, và đó là cách tôi thường làm mọi thứ. –

+0

@ Ryan-Versaw Tôi muốn cung cấp một biểu thức XPath (có thể là XPath 1.0 hoặc XPath 2.0), nếu có một tài liệu XML cụ thể được cung cấp và nếu có một mô tả nghiêm ngặt về kết quả phải được tạo ra. –

1

tôi có thể thấy vấn đề của bạn, nhưng tôi đã sử dụng LINQ để chỉ sắp xếp lại một tập tin GPX để có được trên đoạn đường trong mỗi phân đoạn theo đúng thứ tự và nó cảm thấy khá thẳng về phía trước .....

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

và cũng sửa chữa một lỗi trong một tập tin GPX giao cho thời gian

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

tôi nghĩ rằng đó là định dạng khá thẳng ....

(vấn đề tôi cố định http://www.everytrail.com/forum/viewtopic.php?f=4&t=1980&p=6447#p6447)

Các vấn đề liên quan