2009-09-18 15 views
7

की तुलना में LINQ से XML को बोझिल लगता है, मैं एक सी # प्रोग्रामर हूं, इसलिए मुझे वीबी में कूल एक्सएमएल सिंटैक्स का लाभ नहीं मिलता है।क्या यह सिर्फ मुझे है? मुझे एक्सपीएथ

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

का प्रयोग सी #, मैं XPath मिल जाए, के बारे में कोड करने के लिए आसान, समझना आसान, सोचने के लिए आसान हो करने के लिए एक बहु नेस्ट का चयन का उपयोग कर LINQ to XML प्रदर्शन की तुलना में। इस वाक्य को देखो, यह ग्रीक शपथ ग्रहण की तरह दिखता है:

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

सभी कास्टिंग, भारी वाक्य रचना, NullPointerExceptions के लिए संभावना। XPath के साथ इनमें से कोई भी नहीं होता है।

मुझे सामान्य रूप से LINQ पसंद है, और मैं इसे ऑब्जेक्ट संग्रह और डेटाबेस पर उपयोग करता हूं, लेकिन क्वेरीिंग एक्सएमएल के साथ मेरा पहला गोलाकार मुझे XPath पर वापस ले गया।

क्या यह सिर्फ मुझे है?

क्या मुझे कुछ याद आ रही है?


संपादित: किसी को "नहीं एक असली सवाल" के रूप में इस बंद करने के लिए मतदान किया। लेकिन यह एक असली सवाल है, स्पष्ट रूप से कहा गया है। सवाल यह है: क्या मैं LINQ से XML के साथ कुछ गलत समझ रहा हूं?

+2

हाँ, यह सिर्फ आप ही है।: पी –

+2

मैं मानता हूं, मुझे एल 2 ओ, एल 2 एस आदि पसंद है, लेकिन जब मैं एक्सएमएल से निपटता हूं तो मैं xpldocument/xmlnode/xmlelement आदि के साथ xpath का उपयोग करने के लिए वापस आ जाता हूं। लिंक-टू-एक्सएमएल शुरू करना आसान हो सकता है लेकिन यदि आपके पास xpath है आपकी उंगलियों में तो यह xpath को हरा नहीं देगा ... – KristoferA

+3

नहीं, यह सिर्फ आप नहीं है। लिंक-टू-एक्सएमएल एक "स्मार्ट" दृष्टिकोण जैसा प्रतीत हो सकता है, लेकिन आपके जैसे, मैं अभी भी XPath पसंद करता हूं। यदि आप XPath जानते हैं और इसका उपयोग कर सकते हैं - हर तरह से, ऐसा करें! :-) आप अकेले नहीं हैं :-) –

उत्तर

4

जब तक यह काम पूरा हो जाता है, तब तक आप सबसे अधिक आरामदायक महसूस करते हैं। मैं XML के साथ क्या करने की आवश्यकता के आधार पर दोनों विधियों का उपयोग करता हूं। यह मुझे लगता है कि आपके पास LINQ अच्छा है और XPath के लिए क्या अच्छा है, इस पर एक अच्छा संभाल है।

5

हां, आपके द्वारा दिया गया उदाहरण बेकार है।

लेकिन LINQ के साथ अविवेक को दूर करने के लिए लचीलापन आता है।

यहां एक उदाहरण दिया गया है कि मैं इसे कैसे सुधारूंगा। (यह किसी भी परीक्षण के बिना सब पर किया जाता है, और मैं भी वास्तविक वर्ग के नाम पता नहीं है, लेकिन यह विचार व्यक्त करना चाहिए)

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

यह एक सुरुचिपूर्ण XPath अभिव्यक्ति की तुलना में अभी भी अधिक बोझिल है। –

+0

@DimitreNovatchev मुझे आपकी सुरुचिपूर्ण एक्सपैथ अभिव्यक्ति देखना अच्छा लगेगा जो उपर्युक्त संग्रह देता है। –

+0

@ टिमजर्विस: मैं एक प्रदान करना चाहता हूं - क्या आप कृपया, XML दस्तावेज़ निर्दिष्ट कर सकते हैं और वास्तव में क्या नोड्स का चयन किया जाना चाहिए? ये उपरोक्त उत्तर में प्रदान नहीं किए जाते हैं, जो इसे हवा में और भी लटकते हैं। –

1

मैं आपके डेटा प्रकारों में से कुछ पर अनुमान लगा रहा हूँ, लेकिन आप कर सकते थे अपने सी # 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") 
    }; 

और मुझे यकीन है कि आप पहले से ही पता @ वाक्य रचना आप वीबी के XML शाब्दिक में विशेषताओं के लिए उपयोग कर सकते हैं कर रहा हूँ।

+0

यह अभी भी एक शानदार XPath अभिव्यक्ति –

+0

की तुलना में अधिक बोझिल है, यह थोड़ी देर के बाद से मैंने सीधे XPath (और लिंक से एक्सएमएल के साथ इसका उपयोग नहीं किया) के साथ निपटाया है, लेकिन 'सरल' XPath अभिव्यक्ति का एक उदाहरण महान होगा । व्यक्तिगत रूप से, मुझे लगता है कि यह उदाहरण बहुत अच्छा लग रहा है, और इस तरह मैं सामान्य रूप से चीजें करता हूं। –

+0

@ रयान-वर्सो मैं एक एक्सपीएथ अभिव्यक्ति प्रदान करना चाहूंगा (चाहे वह XPath 1.0 या XPath 2.0 हो), यदि कोई विशिष्ट XML दस्तावेज़ प्रदान किया गया है और यदि कोई परिणाम है कि इसका परिणाम क्या होना चाहिए इसका सख्त विवरण है। –

1

मैं आपकी समस्या

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

देख सकते हैं, लेकिन मैं LINQ इस्तेमाल किया सिर्फ सही क्रम में हर क्षेत्र में ट्रैकपाइंट पाने के लिए एक GPX फ़ाइल को पुन: व्यवस्थित करने के लिए है और यह नहीं बल्कि सीधे आगे लगता है ..... और भी ठीक समय

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

के लिए एक वितरित GPX फ़ाइल में एक बग मुझे लगता है कि नहीं बल्कि सीधे प्रारूप है ....

(समस्या मैं http://www.everytrail.com/forum/viewtopic.php?f=4&t=1980&p=6447#p6447 निर्धारित)

संबंधित मुद्दे