Нужна помощь с XElement Query - PullRequest
1 голос
/ 06 ноября 2010

Этот запрос не работает, как я ожидал. Кто-нибудь видит проблему?

Я пытаюсь получить элемент по имени, но он ничего не возвращает. Вот конкретная часть функции, с которой мне нужна помощь:

alt text


Обновление

Решением было использование XName вместо строки. Вот так:

var matchingElements = elements.Where(e => e.Name.Equals(XName.Get(name)));

Ответы [ 3 ]

3 голосов
/ 06 ноября 2010

Попробуйте изменить строку на:

elements.Where(e => e.Name.LocalName == name) 

Важной частью является LocalName, иначе вы сравниваете равенство XName с string. Помните, что XML поддерживает имена в стиле «prefix: element-name». В этом примере «prefix» - это идентификатор, связанный с пространством имен, возвращаемым e.Name.Namespace, а «element-name» - это идентификатор, возвращаемый e.Name.LocalName.

2 голосов
/ 06 ноября 2010

Ответ Кирка прямо на деньги.Я хотел бы указать на несколько проблем с вашим кодом.

Эта строка излишне подсчитывает все элементы:

var hasMatch = matchingElements.Count() > 0;

Вы можете заменить его на Any(), который закончится рано, как только элементнайдено:

var hasMatch = matchingElements.Any();

Далее, проверив, что hasMatch - это true, вам следует позвонить First() вместо FirstOrDefault(), поскольку вы знаете, что в этой точке должно быть значение.

Сказав это, вы могли бы переписать свой код следующим образом:

var matchingElement = elements.FirstOrDefault(e => e.Name.LocalName == name);
return (string)matchingElement;

Здесь приведение к string вернет значение элемента, если он был найден, в противном случае он вернет null.Приведение используется на тот случай, если оно было null, так как вы не сможете использовать matchingElement.Value, который выдаст NullReferenceException, если элемент не найден.Вам также следует рассмотреть возможность использования SingleOrDefault, если вы ожидаете, что существует только один элемент.

1 голос
/ 06 ноября 2010

Я думаю, вам нужно добавить корневое пространство имен к имени элемента.Вы также можете попробовать использовать метод XContainer.Descendants(XName).

...