2011-10-25 8 views
6

Bir öznitelik değerine göre benzersiz bir öğe kümesi döndüren bir xml dosyası var.Linq to XML bir öznitelik değeri için bir düğüm noktası seçilmesi

<doc> 
    <float name="score">1.2873721</float> 
    <arr name="2_category"> 
     <long>3021</long> 
    </arr> 
    <arr name="ATR_FamilyName"> 
     <str>Some Cookbook </str> 
    </arr> 
    <arr name="ATR_IsFamily"> 
     <str>0</str> 
    </arr> 
    <arr name="ATR_SellPrice"> 
     <str>49.95</str> 
    </arr> 
    <arr name="ATR_VendorId"> 
     <str>ABC</str> 
    </arr> 
    <arr name="ATR_VendorName"> 
     <str>WROX</str> 
    </arr>  
</doc> 

Ben "Ürün" sınıfı doldurmak için linq kullanıyorum: Ben onun adıyla bir düğüm seçemezsiniz gibi bu bir sorun sunar. Öğeleri konuma göre seçebilirim, ancak düğüm mevcut değilse sorun olur. Özelliğinin değerine göre bir düğüm seçmenin bir yolu var mı? Aşağıdaki örnekte, @name özniteliği "ATR_FamilyName" ise arr düğümünü alabilir miyim? XPath'de olurdu: kolayca belirtilen bir özelliği var sadece düğümleri seçebilir LINQ ile

var query = from rt in results 
    where (String)rt.Descendants().ElementAt(5).Element("str").Value == "0" 
    select new Product.Product 
      { 
       FamilyName = (String)rt.Descendants().ElementAt(3).Value 
       // doc/arr[@name = 'ATR_FamilyName']/str - select Family Name is arr/@name 'ATR_FamilyName'        
       MorePropertiestoset....        
       }; 

cevap

17

AS-CII'nin yanıtı gibi, ancak bir sorgu ifadesi kullanmadan (dış olanı hariç) ve XAttribute için döküm ile ve anonim bir tür içinde str öğe değerini seçerek: Attribute("name") yapılan çağrı sonucu alçıda kullanımı özniteliği yok herhangi unsurlar varsa, döküm hangi değil (bir null başvuru sonuçlanacak demektir

select new Product.Product 
{ 
    FamilyName = rt.Descendants("arr") 
        .Where(x => (string) x.Attribute("name") == "ATR_FamilyName") 
        .Select(x => (string) x.Element("str")) 
        .FirstOrDefault(), 
    MorePropertiesToSet....        
}; 

Not dize değişmezine eşit değil). Value özelliğini kullanırsanız, bir istisna alırsınız. Bazen bir istisna daha iyi olabilir - eğer bu veriler temelde bozuk olduğunu gösterirse ve değerle eşleşmektense bunun hakkında öğrenmek istersiniz.

(aynı string için XElement döküm için de geçerlidir.)

+0

Teşekkür Jon dan yazmak için

from rt in results.descendants("<node name>") where rt.attribute(attribute name).value == "specified value" select rt 

Maalesef

- Sen çivilenmiş. Ben herkesin hızlı cevabını uygun bir şekilde yayınlamadaki açıklama için Jon'dan – PhillyNJ

+0

Thx. Tüm düğümlerin özniteliği olmadığı ve bir istisna attığım durumlara koşuyordum çünkü kullandım. Bu fidex. –

5

böyle:

var query = from node in results.Descendants("arr") // I believe you could use results.Elements("arr") here 
      where node.Attribute("name").Value == "ATR_FamilyName" 
      select new Product 
      { 
       FamilyName = node.Element("str").Value 
      }; 
burada
doc/arr[@name = 'ATR_FamilyName']/str 

xml sorgusuna benim linq olduğunu
2

kullanın böyle XElement: cep telefonu