2010-11-19 15 views
2
<Results> 
    <ResultSet>"nothing special" Description="More of nothing" 
    <Results> 
     <Result> 
     <Body>Four in this group</Body> 
     <Body2>this is more stuff I want</Body2> 
     <Body3>This is interesting stuff I want</Body3> 
     <Body4>this is more stuff I want</Body4> 
     </Result> 
     <Result> 
     <Something1>Only 3 in the group</Something1> 
     <ID>this is more stuff I want</ID> 
     <Stuff>This is interesting stuff I want</Stuff> 
     </Result> 
     <Result> 
     <Tag1>Only 3 in the group</Tag1> 
     <Tag2>this is more stuff I want</Tag2> 
     <Tag3>This is interesting stuff I want</Tag3> 
     </Result> 
    </Results> 
    </ResultSet> 
</Results> 

Tüm <Result> bloklarını dışarı çekmek için Linq'i XML'de nasıl kullanırım? Gördüğünüz gibi, her blokta çok sayıda eleman bulunabilir ve ne aradıklarını bilmiyorum. Son hedefim, bu blokları benim uygulamamdan geçireceğim nesnelerin içine yerleştirmektir.LINQ To XML - İç elemandaki tüm elemanlar nasıl sorgulanır?

Sahip olduğum konu, her grubun Linq kullanarak ayrı ayrı ayrılmasını sağlayamam. Alabildiğim en yakın nokta, <Result> TÜM içindeki tüm öğeleri bir büyük listeye (Descendants kullanarak) döndürmektir.

Düzenleme: Bu, her bir <Result> grubundaki her şeyi geri getirmek için kullanıyorum koddur. Ad/değer çiftlerini kırmak için bu sorgudan listeyi nasıl yineleyeceğimi anlayamıyorum. Elemanların isimlerini bilmiyorum, bu yüzden onlara isimle başvuramıyorum. Sonunda, her bir öğenin ad/değer çiftini her <Result> içinde istiyorum.

var query = from item in xml.Descendants("Result") 
       select item; 

Herhangi bir yardım?

sayesinde -Scott

+0

'Descendants'' "içeride" şeyler dönmemesi Results' öğesi. Sonuç olarak bir dizi sonucu döndürmeli ve görünüşe göre ihtiyacın olan şey bu. Descendants ile tam olarak ne çalışmaz? –

+0

Kullandığım kodu ve yapmaya çalıştığım kodu göstermek için gönderiyi yeni güncelledim. – Scott

cevap

1

Descendants adı belirtilen tüm soyundan düğümleri çekecek. Eğer spesifik olmak istiyorsanız, XML hiyerarşi elemanını xml.Element("ResultSet").Element("Results").Elements("Result") gibi bir öğeye göre gözden geçirmeniz gerekir.

Bu doğru yönde işaret etmelidir:

var query = xml.Descendants("Result") 
       .Select(r => r.Elements() 
          .Select(e => new { Name = e.Name.LocalName, Value = e.Value })); 
foreach (var result in query) 
{ 
    foreach (var item in result) 
    { 
     Console.WriteLine("{0} : {1}", item.Name, item.Value); 
    } 
} 

Alternatif olarak, SelectMany kullanmak ve sonuç kümesini dümdüz:

var query = xml.Descendants("Result") 
       .SelectMany(r => r.Elements() 
           .Select(e => new { Name = e.Name.LocalName, Value = e.Value })); 
foreach (var item in query) 
{ 
    Console.WriteLine("{0} : {1}", item.Name, item.Value); 
} 
+0

İlk örneğiniz tam olarak aradığım şey. Bu, adı/değerleri gruplandırır. İkinci örnek aldığım şeydi. Bir grubun nerede başladığını ve diğer bittiği yeri bilmediğim için faydalı olmak için çok düz. Bu harika. Teşekkürler! – Scott