Найти элементы по атрибуту с помощью 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>
Есть ли у вас какие-либо подсказки, чтобы пролить свет на это?
Ответы
Ответ 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);