Найти элементы по атрибуту с помощью XDocument - PullRequest
24 голосов
/ 21 апреля 2010

Этот запрос кажется правильным, но у меня 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>

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

Ответы [ 2 ]

46 голосов
/ 21 апреля 2010

Что ж, элементы 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);
32 голосов
/ 21 апреля 2010

изменить Users во 2-й строке на User. Как это:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...