Этот запрос, кажется, допустим, но у меня есть 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>
У Вас есть какие-либо подсказки для проливания некоторого света на это?
измените Пользователи
во второй строке на Пользователь
. Примерно так:
IEnumerable<XElement> users = (from el in XMLDoc.Root.Elements("User")
where (string)el.Attribute("GUID") == userGUID.ToString()
select el);
Я предполагаю, что XMLDoc - это XDocument, а не сам корневой элемент.
Ну, элементы Пользователи не имеют атрибутов 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);