¿Cómo puedo hacer que LINQ to XML no tenga todos los espacios de nombres? O alternativamente, ¿cómo elimino los espacios de nombres?
Lo pregunto porque los espacios de nombres se establecen de forma semi-aleatoria y estoy cansado de tener que buscar nodos con y sin un espacio de nombres.
Respuestas:
En lugar de escribir:
escribir:
y cuando te canses, crea tu propio método de extensión:
public static IEnumerable<XElement> ElementsAnyNS<T>(this IEnumerable<T> source, string localName) where T : XContainer { return source.Elements().Where(e => e.Name.LocalName == localName); }
Lo mismo ocurre con los atributos, si tiene que lidiar con atributos con espacios de nombres a menudo (lo cual es relativamente raro).
[EDITAR] Añadiendo solución para XPath
Para XPath, en lugar de escribir:
puedes usar la
local-name()
función:fuente
xDoc.Root.Descendants().Where(e => e.Name.LocalName == "SomeName");
Aquí hay un método para quitar espacios de nombres:
Uso de ejemplo:
fuente
Como encontré esta pregunta en la búsqueda de una manera fácil de ignorar los espacios de nombres en los atributos, aquí hay una extensión para ignorar los espacios de nombres al acceder a un atributo, basada en la respuesta de Pavel (para facilitar la copia, incluí su extensión):
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); }
fuente