respuesta nodo leer especifico ejemplos atributos c# xml linq linq-to-xml

c# - nodo - Encuentra elementos por atributo usando XDocument



leer xml c# (2)

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

  • Mire XDocument.Root.Elements("User")
  • Usa 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, todavía podemos poner esto en orden. En primer lugar, vamos a convertir a Guid 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 muchas razones para usar una expresión de consulta aquí ... todo lo que está aplicando es un predicado único. Usemos el método Where directamente:

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

La forma en que lo extienda depende de usted, por supuesto :) Con una línea más larga, probablemente pueda alinear todo en una primera línea más larga:

IEnumerable<XElement> users = XMLDoc.Root . etc

Ahora, finalmente, ¿qué pasa si el elemento Usuario no tiene un atributo GUID? Actualmente, este código lanzará una excepción. Eso puede ser exactamente lo que quieres, o puede que no. Si no lo es, puedes hacer que ignore esas cosas Nullable<Guid> a Nullable<Guid> aka Guid? en lugar:

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

Esta consulta parece ser válida, pero tengo 0 resultados.

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>

¿Tienes alguna pista para arrojar algo de luz sobre esto?


cambiar Users en la 2ª línea a User . Me gusta esto:

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

Supongo que XMLDoc es un XDocument y no el elemento raíz en sí mismo.