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.