Смотрите, когда имеете дело с LINQ to XML, почему вы не используете LINQ для получения реального объекта.
Потомки находят каждый элемент из всего XML и перечисляют все объекты, которые соответствуют указанному имени. Так что в вашем случае хеш это имя, которое он находит.
Итак, вместо того, чтобы делать
var hash = xml.Descendants("hash").FirstOrDefault().Value;
Я бы распался, как:
var elements = xml.Descendants("hash");
var hash = elements.FirstOrDefault();
if(hash != null)
hash.Value // as hash can be null when default.
Таким образом, вы также можете получить атрибуты, элементы узлов и т. Д.
Проверьте эту статью, чтобы получить ясное представление об этом, чтобы оно помогло.
http://www.codeproject.com/KB/linq/LINQtoXML.aspx
Я надеюсь, что это поможет вам.