2010-04-20 13 views
19

Esta consulta parece ser válida, pero tengo 0 resultados.Encontrar elementos por atributo usando XDocument

IEnumerable<XElement> users = 
      (from el in XMLDoc.Elements("Users") 
      where (string)el.Attribute("GUID") == userGUID.ToString() 
      select el); 

Mi XML es el siguiente:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Users> 
    <User GUID="68327fe2-d6f0-403b-a7b6-51860fbf0b2f"> 
    <Key ID="F7000012ECEAD101"> 
     ... 
    </Key> 
    </User> 

</Users> 

¿Tiene alguna pista de arrojar algo de luz sobre esto?

Respuesta

26

cambie Users en la 2da línea a User. De esta manera:

IEnumerable<XElement> users = (from el in XMLDoc.Root.Elements("User") 
            where (string)el.Attribute("GUID") == userGUID.ToString() 
            select el); 

Asumo XMLDoc es un XDocument, y no el elemento raíz en sí.

+1

Gracias, esto fue en parte lo que necesitaba, un error estúpido de mí. – Nacho

+3

Como Jon señala a continuación, seleccionar el tipo correcto es una mejor opción. Además, si usa "el.Attribute (" GUID "). Value" obtendrá automáticamente una cadena como el tipo de devolución y no hay necesidad de lanzar. –

+2

'root' debe ser' Root' en 'XMLDoc.root.Elements (" User ")'. – Appulus

43

Bueno, los Usuarios elementos no tienen atributos GUID. Dos opciones sugeridas:

  • Mira XDocument.Root.Elements("User")
  • Uso Descendants("User") para encontrar todos los elementos de usuario.

Me quedaré con el primero por el momento. Eso nos da:

IEnumerable<XElement> users = 
      (from el in XMLDoc.Root.Elements("User") 
      where (string) el.Attribute("GUID") == userGUID.ToString() 
      select el); 

Ahora, aún podemos arreglar esto más. En primer lugar, vamos a echado a Guid en lugar de string:

IEnumerable<XElement> users = 
    (from el in XMLDoc.Root.Elements("User") 
    where (Guid) el.Attribute("GUID") == userGUID 
    select el); 

Sin embargo no hay mucha razón para usar una expresión de consulta aquí ... todo lo que está solicitando es un predicado. Vamos a usar el método Where directamente:

IEnumerable<XElement> users = 
    XMLDoc.Root 
      .Elements("User") 
      .Where(el => (Guid) el.Attribute("GUID") == userGUID); 

Cómo pones a cabo depende de usted, por supuesto :) Con una línea más larga, es probable que pueda alinear todo en el marco de una larga primera línea:

IEnumerable<XElement> users = XMLDoc.Root 
            . etc 

Ahora, finalmente, ¿qué pasa si el elemento de usuario no tiene un atributo de GUID? Actualmente, este código lanzará una excepción. Eso puede ser exactamente lo que quiere, o puede que no. Si no es así, puede que sea ignorar tales cosas por colada a Nullable<Guid> aka Guid? lugar:

IEnumerable<XElement> users = 
    XMLDoc.Root 
      .Elements("User") 
      .Where(el => (Guid?) el.Attribute("GUID") == userGUID); 
+0

Gracias, esto también fue de gran utilidad, lástima que solo puedo marcar uno como correcto. – Nacho

+13

no me preocuparía. Jon tiene 470 mil puntos. – FlavorScape

+2

y logró duplicar sus puntos en tres años –

Cuestiones relacionadas