Comment faire pour que LINQ to XML iqnore tous les espaces de noms? Ou alternativement, comment supprimer les espaces de noms?
Je demande parce que les espaces de noms sont définis de manière semi-aléatoire et que je suis fatigué de devoir rechercher des nœuds avec et sans espace de noms.
Réponses:
Au lieu d'écrire:
écrire:
et quand vous en avez assez, créez votre propre méthode d'extension:
public static IEnumerable<XElement> ElementsAnyNS<T>(this IEnumerable<T> source, string localName) where T : XContainer { return source.Elements().Where(e => e.Name.LocalName == localName); }
Idem pour les attributs, si vous devez souvent gérer des attributs d'espacement de noms (ce qui est relativement rare).
[EDIT] Ajout d'une solution pour XPath
Pour XPath, au lieu d'écrire:
vous pouvez utiliser la
local-name()
fonction:la source
xDoc.Root.Descendants().Where(e => e.Name.LocalName == "SomeName");
Voici une méthode pour supprimer les espaces de noms:
Exemple d'utilisation:
la source
Comme j'ai trouvé cette question à la recherche d'un moyen simple d'ignorer les espaces de noms sur les attributs, voici une extension pour ignorer les espaces de noms lors de l'accès à un attribut, basée sur la réponse de Pavel (pour une copie plus facile, j'ai inclus son extension):
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); }
la source