Как мне использовать LINQ to XML iqnore для всех пространств имен? Или, альтернативно, как удалить пространства имен?
Я спрашиваю, потому что пространства имен задаются полуслучайно, и я устал от необходимости искать узлы как с пространством имен, так и без него.
Ответы:
Вместо написания:
записывать:
а когда вам это надоест, создайте свой собственный метод расширения:
public static IEnumerable<XElement> ElementsAnyNS<T>(this IEnumerable<T> source, string localName) where T : XContainer { return source.Elements().Where(e => e.Name.LocalName == localName); }
То же самое и с атрибутами, если вам часто приходится иметь дело с атрибутами в пространстве имен (что встречается относительно редко).
[EDIT] Добавление решения для XPath
Для XPath вместо записи:
вы можете использовать
local-name()
функцию:источник
xDoc.Root.Descendants().Where(e => e.Name.LocalName == "SomeName");
Вот метод удаления пространств имен:
Пример использования:
источник
Поскольку я нашел этот вопрос в поисках простого способа игнорировать пространства имен в атрибутах, вот расширение для игнорирования пространств имен при доступе к атрибуту, основанное на ответе Павла (для упрощения копирования я включил его расширение):
public static XAttribute AttributeAnyNS<T>(this T source, string localName) where T : XElement { return source.Attributes().SingleOrDefault(e => e.Name.LocalName == localName); } public static IEnumerable<XElement> ElementsAnyNS<T>(this IEnumerable<T> source, string localName) where T : XContainer { return source.Elements().Where(e => e.Name.LocalName == localName); }
источник