Cóż, elementy Użytkownicy nie mają atrybutów GUID. Dwie je opcje:
- spojrzeć na
XDocument.Root.Elements("User")
- użytkowania
Descendants("User")
znaleźć wszystkie elementy użytkowników.
Będę trzymać się tego pierwszego na chwilę. To daje nam:
IEnumerable<XElement> users =
(from el in XMLDoc.Root.Elements("User")
where (string) el.Attribute("GUID") == userGUID.ToString()
select el);
Teraz możemy jeszcze posprzątać. Po pierwsze, niech oddane do Guid
zamiast string
:
IEnumerable<XElement> users =
(from el in XMLDoc.Root.Elements("User")
where (Guid) el.Attribute("GUID") == userGUID
select el);
jednak nie ma tam wiele powodów, by używać wyrażenia kwerendy tutaj ... wszystko starasz to pojedynczy orzecznik. Niech po prostu użyć metody Where
bezpośrednio:
IEnumerable<XElement> users =
XMLDoc.Root
.Elements("User")
.Where(el => (Guid) el.Attribute("GUID") == userGUID);
Jak położyć go do ciebie, oczywiście :) Przy dłuższej linii, prawdopodobnie można wyrównać wszystko do góry pod dłuższym pierwszej linii:
IEnumerable<XElement> users = XMLDoc.Root
. etc
Teraz wreszcie - co się stanie, jeśli element User nie ma atrybutu GUID? Obecnie ten kod rzuca wyjątek. To może być dokładnie to, czego chcesz - lub może nie. Jeśli tak nie jest, można je ignorować takie rzeczy, oddając do Nullable<Guid>
aka Guid?
zamiast:
IEnumerable<XElement> users =
XMLDoc.Root
.Elements("User")
.Where(el => (Guid?) el.Attribute("GUID") == userGUID);
Dzięki, było to po części to, co potrzebne, głupi błąd ze mną. – Nacho
Jak Jon wskazuje poniżej, rzucanie do właściwego typu jest lepszym wyborem. Dodatkowo, jeśli użyjesz "el.Attribute (" GUID "), wartość" automatycznie otrzymasz ciąg znaków jako typ zwracany i nie będzie potrzeby używania rzutowania. –
'root' powinno być' Root' w 'XMLDoc.root.Elements (" User ")'. – Appulus