2010-04-20 22 views
19

To zapytanie wydaje się być prawidłowe, ale mam 0 wyników.Znajdź elementy według atrybutów za pomocą XDocument

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

Moje XML jest następujący:

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

</Users> 

Czy macie jakieś wskazówki, aby rzucić nieco światła na to?

Odpowiedz

26

zmiana Users w drugiej linii na User. W ten sposób:

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

Zakładam, że XMLDoc to XDocument, a nie sam element główny.

+1

Dzięki, było to po części to, co potrzebne, głupi błąd ze mną. – Nacho

+3

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. –

+2

'root' powinno być' Root' w 'XMLDoc.root.Elements (" User ")'. – Appulus

43

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); 
+0

Dzięki, to też było bardzo przydatne, szkoda, że ​​nie mogę oznaczyć tylko jednego jako poprawnego. – Nacho

+13

Nie przejmowałbym się tym. Jon ma 470 tysięcy punktów. – FlavorScape

+2

i udało mu się podwoić swoje punkty w ciągu trzech lat –

Powiązane problemy