2009-10-28 15 views
8

Bir IEnumerables koleksiyonum var ve her birinin, iş nesnesinde farklı bir özelliğe karşılık gelen farklı bir özellik değerleri var. İşte karşı sorgulama ediyorum XML bir örnek:Öznitelik değeriyle XElement öğelerini bulun

<SimpleData name="zip">60004</SimpleData> 
    <SimpleData name="name">ARLINGTON HEIGHTS</SimpleData> 
    <SimpleData name="state">IL</SimpleData> 
    <SimpleData name="countyname">COOK</SimpleData> 
    <SimpleData name="lat">42.1121336684356</SimpleData> 
    <SimpleData name="lon">-87.9736682731814</SimpleData> 

benim linq2xml lambda yakın olduğunu düşünüyorum (SO MSDN arama ve sonrası) ama sadece doğru oynamak gibi olamaz:

string cityName = simpleData.Where(a => a.Attribute("name").Value == "name").Select(a => a.Value).ToString(); 

"System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement, System.String]" yerine Arlington Heights

Herhangi öneri ait atanan cITYNAME olsun en değeri nedir? Teşekkür

cevap

16
string cityName = (simpleData.Where(a => a.Attribute("name").Value == "name") 
        .Select(a => a.Value)).FirstOrDefault(); 

veya name nitelik name eşittir tüm eleman değerleri içeren (hemen hemen her zaman koleksiyonları ve tek değil örneklerini dönmek Linq uzantısı yöntemleri) bir IEnumerable<string> döndürür

(from x in simpleData 
where x.Attribute("name").Value == "name" 
select x.Value).FirstOrDefault() 

. Sonra ilkini alırız, ya da boşsa null. Ayrıca, bu XML korkunç ve vurulmalıdır.

+6

+1 çekilmelidir! – CoderDennis

+5

Öznitelik ("ad") 'üzerinde' (dize) Öznitelik ("ad") 'kullanılmasını öneririm. Değer '- aynı şeydir, ancak bir null-check ilk olarak yapar. Attribute() işlevi, bir öğede böyle bir adla hiçbir özellik çıkmadığında "null" değerini döndürdüğünden, bu tür ilk öğe, şu anda yazılmış olan sorguda bir "NullReferenceException" tetikler. –

+0

Damnit, Ben eksik bir şey olduğunu biliyordum, FirstOrDefault ekleyerek yaptı. Teşekkürler. XML hakkında fazla bir şey yapamam, 3. taraf veri alma kaynağı. –

3

XML varsa: XElement/XDocument SimpleDataList yüklenen

<SimpleDataList> 
    <SimpleData name="zip">60004</SimpleData> 
    <SimpleData name="name">ARLINGTON HEIGHTS</SimpleData> 
    <SimpleData name="state">IL</SimpleData> 
    <SimpleData name="countyname">COOK</SimpleData> 
    <SimpleData name="lat">42.1121336684356</SimpleData> 
    <SimpleData name="lon">-87.9736682731814</SimpleData> 
</SimpleDataList> 

, XPath ile sorgulayabilir:

SimpleDataList.XPathSelectElement(@"//SimpleDataList/SimpleData[@Name=""name""]"); 

Ama sen bir XElement varsa emin değilim ile başlayın ya da basit bir IEnumerable ... Her durumda .. Ben size yardımcı olması durumunda XPath bahsedeceğim anladım. Bu XML için

+1

Özellikle XINoc'a uyarlandığından, Xdocument'i sorgulamak için XPath kullanmak çok mantıklı değil. XPath da biraz daha yavaş olacak (çünkü önce ayrıştırılması gereken bir dizedir). –