Мне нужно получить один конкретный атрибут из элемента с определенным локальным именем, но с любым пространством имен (если вы знакомы с XMPP, вы поймете, почему). Помимо написания моих собственных методов расширения (перечислитель или единичный выбор), есть какие-нибудь идеи?
У меня есть такие, но они мне совсем не нравятся:
XAttribute from = (from c in elem.Attributes()
where c.Name.LocalName == "from"
select c).FirstOrDefault<XAttribute>();
XAttribute to = (from c in elem.Attributes()
where c.Name.LocalName == "to"
select c).FirstOrDefault<XAttribute>();
изменить: хотелось бы что-то вроде:
string val = (string)elem.Attribute("{*}to");
решение:
XAttribute from = elem.Attributes()
.FirstOrDefault(a => a.Name.LocalName == "from");
XAttribute to = elem.Attributes()
.FirstOrDefault(a => a.Name.LocalName == "to");
@Joe, основная моя проблема - это "jabber: server", "jabber: client" и так далее.





Если вам не нравится синтаксис, вы можете использовать этот;
elem.Attributes().FirstOrDefault(a=>a.Name.LocalName == "from");
кстати, для полноты это должно быть a => a.Name.LocalName == "from".
+1. Выражения запросов удобны, когда они выполняют сложные задачи, но когда выполняется всего одна или две операции, «точечная нотация» действительно проще.
Разве большинство атрибутов XMPP не находятся в пустом пространстве имен? Мы почти никогда не префиксируем, и они не выбирают автоматически пространство имен элемента, в котором они находятся.