2008-12-05 21 views
7

tengo un documento XML que mira similar a esto:Seleccionar XElements únicas (por atributo) con un filtro usando LinqToXml

<items> 
<item cat="1" owner="14">bla</item> 
<item cat="1" owner="9">bla</item> 
<item cat="1" owner="14">bla</item> 
<item cat="2" owner="12">bla</item> 
<item cat="2" owner="12">bla</item> 
</items> 

Ahora me gustaría llegar a todos los propietarios únicos (que en realidad sólo es necesario el valor del atributo del propietario) perteneciente a una categoría específica utilizando una consulta linq. En mi ejemplo, la consulta para el gato 1 devolvería una lista que contiene 9 y 14. ¿Cómo puedo hacer eso? La sintaxis de Linq sería preferible a Lambdas. Gracias de antemano;)

Respuesta

15

Suponiendo que el fragmento está en itemsElement:

var distinctOwners = (from item in itemsElement.Element("item") 
where itemElements.Attribute("cat") == 1 
select item.Attribute("owner")).Distinct(); 

Disculpas por el formato y la sangría!

+1

o en forma de 'lambda': itemElements .Where (x => x.Attribute ("gato") == 1) .SELECT (x => x.Attribute ("owner")) .Distinct(); ¡Personalmente prefiero eso! – Jennifer

+0

'itemElements' debe ser 'item' en where cláusula. El método de atributo devuelve un XAttribute que no se puede comparar con 1 usando == necesita un molde para int y Distinct para cat = "2" aún devolverá 2 elementos ya que ambos atributos son cada uno un objeto distinto. – AnthonyWJones

+1

... por lo tanto, aparte de los flagrantes errores de sintaxis y mi completa falta de conocimiento de xlinq, estoy totalmente de acuerdo con el dinero. Me pregunto si hay alguna forma de rechazar sus propias publicaciones ... – Jennifer

2

Pruebe esta función: -

static IEnumerable<int> GetOwners(XDocument doc, string cat) 
{ 
    return from item in doc.Descendants("item") 
     where item.Attribute("cat").Value == cat 
     select (int)item.Attribute("owner")).Distinct(); 

} 
0
XElement ele = XElement.Parse(@"<items><item cat=""1"" owner=""14"">bla</item><item cat=""1"" owner=""9"">bla</item>" + 
           @"<item cat=""1"" owner=""14"">bla</item><item cat=""2"" owner=""12"">bla</item>" + 
           @"<item cat=""2"" owner=""12"">bla</item></items>"); 

    int cat = 1; 


    List<int> owners = ele.Elements("item") 
    .Where(x=>x.Attribute("cat").Value==cat.ToString()).Select(x=>Convert.ToInt32(x.Attribute("owner").Value)).Distinct().ToList(); 
Cuestiones relacionadas