Como faço para ter LINQ to XML iqnore todos os namespaces? Ou, alternativamente, como remover os namespaces?
Estou perguntando porque os namespaces estão sendo definidos de forma semi-aleatória e estou cansado de ter que procurar nós com e sem um namespace.
Respostas:
Em vez de escrever:
escrever:
e quando você se cansar disso, faça seu próprio método de extensão:
public static IEnumerable<XElement> ElementsAnyNS<T>(this IEnumerable<T> source, string localName) where T : XContainer { return source.Elements().Where(e => e.Name.LocalName == localName); }
O mesmo vale para atributos, se você tiver que lidar com atributos de namespace com frequência (o que é relativamente raro).
[EDIT] Adicionando solução para XPath
Para XPath, em vez de escrever:
você pode usar a
local-name()
função:fonte
xDoc.Root.Descendants().Where(e => e.Name.LocalName == "SomeName");
Este é um método para remover namespaces:
Exemplo de uso:
fonte
Como encontrei esta pergunta em busca de uma maneira fácil de ignorar namespaces em atributos, aqui está uma extensão para ignorar namespaces ao acessar um atributo, com base na resposta de Pavel (para facilitar a cópia, incluí sua extensão):
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); }
fonte