2010-03-13 5 views
4

Étant donnée une structure XML comme ceci:Quelle est la meilleure façon de déplacer "un enfant" dans un .NET XmlDocument?

<garage> 
<car>Firebird</car> 
<car>Altima</car> 
<car>Prius</car> 
</garage> 

Je veux « bouger » le noeud Prius « un niveau plus haut » de sorte qu'il apparaît au-dessus du nœud Altima. Voici la structure finale je veux:

<garage> 
<car>Firebird</car> 
<car>Prius</car> 
<car>Altima</car> 
</garage> 

Donc, étant donné le code C#:

XmlNode priusNode = GetReferenceToPriusNode() 

Quelle est la meilleure façon de provoquer la priusNode « monter » une place dans la liste des enfants du garage?

+2

Pourquoi voudriez-vous déplacer la Prius avec ses problèmes de freins? – kenny

+1

@Mike: vous savez que la classe 'XmlDocument' est la même pour C# que pour VB.NET, n'est-ce pas? L'appeler un "C# XmlDocument" était juste une manière de parler, non? –

Répondre

8

Obtenez le nœud frère précédent, supprimez le nœud que vous souhaitez déplacer de son parent, et ré-insérer avant la fratrie.

XmlNode parent = priusNode.ParentNode. 
XmlNode previousNode = priusNode.PreviousSibling; 
//parent.RemoveChild(priusNode); // see note below 
parent.InsertBefore(priusNode, previousNode); 

gestion des erreurs, mais ignoré serait nécessaire pour la mise en œuvre réelle.

EDIT: par le commentaire de Mike, l'appel RemoveChild est superflue: les docs disent: « Si le newChild [dans ce cas priusNode] est déjà dans l'arbre, il est retiré de sa position initiale et a ajouté à sa position cible. " Merci Mike!

+0

C'est vraiment simple et a bien fonctionné. J'ai également noté que l'appel de RemoveNode() est étranger - InsertBefore() le déplacera juste. – Mike

+0

pour le rendre plus général et sûr, vous devriez ajouter un contrôle pour voir si previousSibling existe vraiment (if (previousNode! = Null) ...) – Allie

Questions connexes