web-dev-qa-db-fra.com

Rechercher des éléments par attribut à l'aide de XDocument

Cette requête semble être valide, mais j'ai 0 résultats.

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

Mon XML est le suivant:

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

</Users>

Avez-vous des indices pour éclairer cela?

24
Nacho

remplacez Users dans la 2e ligne par User. Comme ça:

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

Je suppose que XMLDoc est un XDocument, et non l'élément racine lui-même.

32
Patrick Karcher

Eh bien, les éléments sers n'ont pas d'attributs GUID. Deux options suggérées:

  • Regardez XDocument.Root.Elements("User")
  • Utilisez Descendants("User") pour trouver tous les éléments utilisateur.

Je vais rester avec l'ancien pour le moment. Cela nous donne:

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

Maintenant, nous pouvons encore ranger cela. Tout d'abord, passons à Guid au lieu de string:

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

Cependant, il n'y a pas beaucoup de raisons d'utiliser une expression de requête ici ... tout ce que vous appliquez est un seul prédicat. Utilisons simplement la méthode Where directement:

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

La façon dont vous le présentez dépend de vous, bien sûr :) Avec une ligne plus longue, vous pouvez probablement tout aligner sous une première ligne plus longue:

IEnumerable<XElement> users = XMLDoc.Root
                                    . etc

Maintenant, enfin - qu'en est-il si l'élément User n'a pas d'attribut GUID? Actuellement, ce code lèvera une exception. C'est peut-être exactement ce que vous voulez - ou pas. Si ce n'est pas le cas, vous pouvez lui faire ignorer de telles choses en lançant Nullable<Guid> alias Guid? au lieu:

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