Подтвердить что ты не робот

Найти элементы по атрибуту с помощью XDocument

Этот запрос кажется действительным, но у меня есть 0 результатов.

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

Мой XML выглядит следующим образом:

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

</Users>

Есть ли у вас какие-либо подсказки, чтобы пролить свет на это?

4b9b3361

Ответ 1

измените Users во второй строке на User. Вот так:

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

Я предполагаю, что XMLDoc является XDocument, а не самим корневым элементом.

Ответ 2

Ну, элементы Users не имеют атрибутов GUID. Два предложенных варианта:

  • Посмотрите XDocument.Root.Elements("User")
  • Используйте Descendants("User"), чтобы найти все элементы пользователя.

Я буду придерживаться прежнего на данный момент. Это дает нам:

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

Теперь мы все еще можем убрать это. Во-первых, отпустите Guid вместо string:

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

Однако здесь не так много причин использовать выражение запроса... все, что вы применяете, - это один предикат. Просто используйте метод Where напрямую:

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

Как вы это делаете, конечно, конечно:) С более длинной строкой вы, вероятно, можете выровнять все под более длинной первой строкой:

IEnumerable<XElement> users = XMLDoc.Root
                                    . etc

Теперь, наконец - что, если элемент User не имеет атрибута GUID? В настоящее время этот код генерирует исключение. Это может быть именно то, что вы хотите - или это может быть не так. Если это не так, вы можете заставить его игнорировать такие вещи, вместо этого: Nullable<Guid> aka Guid?:

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