31 Stimmen

Elemente nach Attribut mit XDocument suchen

Diese Abfrage scheint gültig zu sein, aber ich habe 0 Ergebnisse.

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

Mein XML ist wie folgt:

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

</Users>

Haben Sie irgendwelche Hinweise, die Licht in diese Angelegenheit bringen?

56voto

Jon Skeet Punkte 1325502

Nun, die Benutzer Elemente haben keine GUID-Attribute. Zwei vorgeschlagene Optionen:

  • Blick auf XDocument.Root.Elements("User")
  • Utilice Descendants("User") zu finden alle Benutzer-Elemente.

Ich bleibe vorerst bei der ersten Variante. Das gibt uns:

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

Jetzt können wir das noch weiter aufräumen. Erstens, lassen Sie uns nach Guid 代わりに string :

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

Es gibt jedoch nicht viel Grund, hier einen Abfrageausdruck zu verwenden... alles, was Sie anwenden, ist ein einzelnes Prädikat. Verwenden wir einfach die Where Methode direkt:

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

Wie du es anlegst, ist natürlich dir überlassen :) Bei einer längeren Zeile können Sie wahrscheinlich alles unter einer längeren ersten Zeile anordnen:

IEnumerable<XElement> users = XMLDoc.Root
                                    . etc

Und was ist, wenn das Element User kein GUID-Attribut hat? Derzeit wird dieser Code eine Ausnahme auslösen. Das kann genau das sein, was Sie wollen - oder auch nicht. Wenn nicht, können Sie solche Dinge ignorieren, indem Sie auf Nullable<Guid> alias Guid? stattdessen:

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

39voto

Patrick Karcher Punkte 22087

Cambiar Users in der 2. Zeile auf User . Etwa so:

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

Ich gehe davon aus, dass XMLDoc ein XDocument ist und nicht das Root-Element selbst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X