Найдите Элементы Атрибутом с помощью 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>

У Вас есть какие-либо подсказки для проливания некоторого света на это?

24
задан Patrick Karcher 21 April 2010 в 20:27
поделиться

2 ответа

измените Пользователи во второй строке на Пользователь . Примерно так:

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

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

32
ответ дан 28 November 2019 в 22:21
поделиться

Ну, элементы Пользователи не имеют атрибутов GUID. Предлагаются два варианта:

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

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

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 aka Guid? :

IEnumerable<XElement> users = 
    XMLDoc.Root
          .Elements("User")
          .Where(el => (Guid?) el.Attribute("GUID") == userGUID);
47
ответ дан 28 November 2019 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: