2016-03-19 16 views
1

Ben FieldName UserName seçmek için çalışıyor ve farklı bir özelliğinde aynı seviyeden ben linq sorgusuBir xml etiketinden aynı düzeyde linq bir özniteliği nasıl seçerim? Aşağıdaki xml olarak

yanlış yapıyorum emin değilim "Değerini"

elde ediyorum

<?xml version="1.0"?> 
<Objects> 
    <Object> 
    <Property Name="Value" Type="System.String">DeathStar</Property> 
    <Property Name="FieldName" Type="System.String">Server</Property> 
    </Object> 
    <Object> 
    <Property Name="Value" Type="System.String">Luke</Property> 
    <Property Name="FieldName" Type="System.String">Username</Property>  
    </Object> 
</Objects> 

     var usernameValue = 
      from v in 
       from e in xd.Descendants().Elements() 
       let p = e.Parent 
       where 
        e.HasAttributes 
        && e.Name.LocalName.Equals("Property") 
        && e.Attribute("Name").Value.Equals("FieldName") 
        && e.Value.Equals("UserName") 
       select p 
      where 
       v.HasAttributes 
       && v.Name.LocalName.Equals("Property") 
       && v.Attribute("Name").Value.Equals("Value") 
      select v.Value; 

cevap

0
sana FieldName kontrol edip dönebilir hangi Object elemanları sorguyu temel almak öneririm

tekabül Value:

var usernameValue = 
     from o in xd.Descendants("Object") 
     where 
      o.Elements("Property") 
      .Where(p => (string)p.Attribute("Name") == "FieldName" && (string)p == "Username") 
      .Any() 
     select 
      o.Elements("Property") 
      .Where(p => (string)p.Attribute("Name") == "Value") 
      .Select(p => (string)p) 
      .FirstOrDefault(); 

Ayrıca bu XML fark büyük/küçük harfe duyarlıdır, bu nedenle XML'inizde olduğu gibi Username, LINQ'nizde olduğu gibi UserName ile eşleşmez.

0

Bu işlem işe yarar, ilk önce Nesne düzeyinde ve sonra Özellik değerinde olmak üzere iki kez koleksiyona filtre uygulamanız gerekir.

var resultnode = doc.Descendants("Object") 
    .Where(d=> d.Descendants("Property").Any(c=>c.Attribute("Name").Value == "FieldName") && d.Descendants("Property").Any(c=>c.Value == "Username")) 
    .Descendants("Property") 
    .Where(p=>p.Attribute("Name").Value == "Value") 
    .FirstOrDefault();  

Şimdi değeri kullanarak erişilebilir.

if(resultnode != null) 
{ 
    resultnode.Value; // value 
} 

Çalışma Code

+0

sayesinde bu resharper FirstOrDefault tek bir çağrı ile değiştirerek hakkında şikayetçi oldu ile gidiş sona erdi, bu yüzden nerede maddesini çıkarılıp .FirstOrDefault içine nereye lambda taşındı. Sanırım şikayetçinin neden yeniden doğduğundan emin olmadığından daha temiz görünüyor. – coredumpman

+0

Sorun değil, problem çözdüğüne sevindim, en iyi çözümü bulmada yardımcı oldu. Bulunan çözümle cevabı yazmanızı öneririm ve bu sorunun cevabını işaretlerim, diğer insanlara yardımcı olabilir. –

İlgili konular