2010-02-18 4 views
2

Pourquoi est-ce d'exécuter ce code ...attributs XML Récupération de

XmlDocument doc = new XmlDocument(); 

string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?> 
        <BaaBaa> 
         <BlackSheep HaveYouAny=""Wool"" /> 
        </BaaBaa>"; 

doc.LoadXml(xml); 

XmlNodeList nodes = doc.SelectNodes("//BaaBaa"); 

foreach (XmlElement element in nodes) 
{ 
    Console.WriteLine(element.InnerXml); 

    XmlAttributeCollection attributes = element.Attributes; 
    Console.WriteLine(attributes.Count); 
} 

produire la sortie suivante dans l'invite de commande?

<BlackSheep HaveYouAny="Wool" /> 
0 

En d'autres termes, ne devrait pas attributes.Count retourner 1?

Répondre

3

Lorsque vous appelez SelectNodes avec "// BaaBaa", tous les éléments de "BaaBaa" sont renvoyés.

Comme vous pouvez le voir dans votre propre document, BaaBaa n'a pas d'attributs, c'est l'élément "BlackSheep" qui a le seul attribut "HaveYouAny".

Si vous souhaitez obtenir le nombre d'attributs des éléments enfants, vous devez naviguer vers celui-ci à partir du nœud sur lequel vous vous trouvez lorsque vous parcourez les nœuds.

+0

Vive. Ma confusion consistait à penser que doc.SelectNodes ("// BaaBaa") retournerait une liste de nœuds des enfants de "BaaBaa", plutôt que de retourner tous les nœuds "BaaBaa" (dans ce cas - seulement 1 nœud, qui a 0 attributs). –

1

element.Attributes contient les attributs de l'élément lui-même, pas ses enfants. L'élément BaaBaa ne possède pas d'attributs, il est vide.

La propriété InnerXml renvoie le code XML du contenu de l'élément et non de l'élément lui-même. Par conséquent, il a un attribut.

0
<BlackSheep HaveYouAny=""Wool"" /> // innerXml that includes children 
<BaaBaa> // is the only node Loaded, which has '0' attributes 

solution

XmlAttributeCollection attributes = element.FirstChild.Attributes; 

produira les résultats suivants, la production nécessaire

<BlackSheep HaveYouAny="Wool" /> 
1