2009-06-11 12 views
2

J'ai un XML que je voudrais obtenir tous ses éléments. J'ai essayé d'obtenir ces éléments par les descendants() ou DescendantNodes(), mais les deux me revins noeuds répétésAppeler le DescendantNodes sans répéter chaque noeud

Par exemple, voici mon xml:

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <FirstElement xsi:type="myType"> 
    <SecondElement>A</SecondElement> 
    </FirstElement> 
</Root> 

et quand j'utiliser cet extrait:

XElement Elements = XElement.Parse(XML); 
IEnumerable<XElement> xElement = Elements.Descendants(); 
IEnumerable<XNode> xNodes = Elements.DescendantNodes(); 
foreach (XNode node in xNodes) 
{ 
    stringBuilder.Append(node); 
} 

il me donne deux nœuds mais en répétant le <SecondElement>. Je sais que les descendants appellent ses enfants et les enfants d'un enfant tout le temps, mais y a-t-il un autre moyen de l'éviter?

Ensuite, c'est le contenu de mon stringbuilder:

<FirstElement xsi:type="myType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SecondElement>A</SecondElement> 
</FirstElement> 

<SecondElement>A</SecondElement> 

Répondre

5

Eh bien vous voulez vraiment tous les descendants ou seulement les éléments de haut niveau? Si vous ne voulez que ceux de niveau supérieur, utilisez la méthode Elements() - qui renvoie tous les éléments directement sous le nœud actuel.

Le problème n'est pas que les nœuds sont répétés - c'est que les nœuds de niveau supérieur incluent les nœuds de niveau inférieur. Ainsi, le nœud de niveau supérieur est renvoyé, puis le nœud de niveau inférieur, et vous écrivez le entier de ces deux nœuds, ce qui signifie que vous écrivez deux fois le nœud de niveau inférieur.

Si vous juste écrivez, disons, le nom du noeud que vous regardez, vous ne verrez pas un problème. Mais vous ne l'avez pas dit ce que vous êtes vraiment essayer de le faire, donc je ne sais pas si ça aide ...

+0

Finalement, je veux seulement avoir A B paradisonoir

+0

par "avoir" exactement ce que vous voulez dire que ? Êtes-vous * réellement * en train d'écrire ceux-ci dans un StringBuilder, ou était-ce juste pour le diagnostic? Il semblerait que vous ayez juste besoin d'un appel à Elements() –

+0

non je dois les écrire dans un stringbuilder et les stocker. – paradisonoir

0
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(XML); 
XmlNodeList allElements = doc.SelectNodes("//*"); 
foreach(XmlElement element in allElements) 
{ 
    // your code here 
} 
+0

Il en résulte le même comportement. – AnthonyWJones

+0

Je pense que le Jon a trouvé que le vrai problème était l'écriture de tous les nœuds, ne renvoyant pas réellement plusieurs nœuds. – Greg

+0

J'ai corrigé ma question. – paradisonoir

Questions connexes