2017-06-30 1 views
1

Salut, je feuilletais avec des fichiers xml et j'ai remarqué quelque chose que j'ai un peu de problème de résolution.XElement et XName se bloque quand xml a un espace de nom au noeud racine

J'ai un Xml qui commence par un nœud racine et a alors un autre nœud enfant qui peut changer le nom par exemple:

<root> 
    <Child1> 
</root> 

Donc, étant donné que « Enfant1 » peut être changé en « Enfant2 » ou « Child3 "J'ai fait en sorte que ce linq puisse extraire le nom de tout ce qui vient à ma rencontre.

premier:

XElement root = XElement.Parse(xml); 

var childType = root.Descendants().First(x => x.Name == "Child1" || x.Name == "Child2"|| x.Name == "Child3").Name; 

Alors, quand j'ai mon xml sans un espace de noms, comme indiqué ci-dessus, il workes bien, je parviens à extraire le nom de la balise de noeud.

Mais quand j'ai un espace de noms dans la balise racine il jette une erreur:

<root xmlns="namespace"> 
    <Child1> 
</root> 

qu'XML en passant par le même LINQ, jette:

Sequence contains no matching element

Répondre

2

Votre élément root a un espace de nom défini (xmlns="namespace") ainsi tous les éléments enfants sont associés au même espace de noms. C'est à dire. Child1 élément sera dans le même espace de noms et son nom contiendra à la fois le préfixe d'espace de noms et le nom local ("Child1"). Donc, vous pouvez spécifier le nom complet lors de la recherche de l'élément Child1:

var ns = root.GetDefaultNamespace(); 
var childType = root.Descendants() 
    .First(x => x.Name == ns +"Child1" || x.Name == ns + "Child2"|| x.Name == ns + "Child3") 
    .Name; 

Ou vous pouvez chercher x.Name.LocalName (mais je ne recommned cette approche, mais il est peu probable que vous aurez Child1 éléments d'un autre espace de noms).

Note: votre élément Child ne pas balise de fermeture (sans doute il est une erreur d'impression)

Pour en savoir plus: Xml Namespaces

+1

Il est probablement utile d'expliquer que cela est dû à l'espace de noms en défaut avec 'xmlns = ...' . J'allais le faire, mais je pensais que ce serait * surtout * un duplicata de votre réponse ... –

+1

Cela a fonctionné parfaitement et était exactement la réponse que je cherchais, merci. – John