2010-07-06 5 views
2

Lorsque j'essaie de supprimer une partie de mon élément enfant avec RemoveChild(). Mais jetez l'exception. J'ai joint mon code ci-dessous.La fonction RemoveChild (nœud XmlNode) a échoué en C#

nodeName = doc.SelectSingleNode("//Equipment//DataCollections//EnabledIDs//MyID[@id='" + attrValue + "']"); 
    // Found the nodeName successfully druing run time. 
    doc.DocumentElement.RemoveChild(nodeName); 
    // faild to Remove the node 

Afficher erreur ci-dessous:

An unhandled exception of type 'System.ArgumentException' occurred in System.Xml.dll 

Additional information: The node to be removed is not a child of this node. 

Comment puis-je supprimer le nœud?

[Mise à jour]

VS2005 & .NET 2.0 utilisé.

+0

Il semble que le nœud enfant, lorsqu'il est sélectionné, n'est pas "lié" à son instance parente à partir de laquelle il a été créé. Cela semble être un bug pour moi. La solution est de faire (comme d'autres l'ont dit): 'childNode.ParentNode.RemoveChild (childNode)' –

Répondre

6

Je crois que .RemoveChild supprime l'enfant du noeud que vous avez sélectionné.

Y at-il des enfants sous nodeName ou est-ce déjà la feuille?

Edit:

En fait, vous devez retirer l'enfant du parent, procédez comme suit:

nodeName.parentNode.removeChild(nodeName) 
+0

Cela fonctionne très bien. Merci à tous. –

1

Au lieu d'utiliser .RemoveChild juste essayer en utilisant .Déposer Cela devrait vous donner le résultat que vous êtes à la recherche de.

:: Modifier

Notez que cela ne fonctionne que si vous utilisez LINQ to XML. Ensuite, vous seriez travailler avec une variation d'un XNode et peut simplement dire blah.Remove et il devrait faire l'affaire. Si vous n'utilisez pas Linq en XML, je vous suggère de regarder dans cette cause, c'est incroyable.

+0

Il n'existe aucune méthode Remove() basée sur mon VS2005 & .NET 2.0. :-) –

+0

@Nano: Linq est venu avec .NET 3.5 (?) D'abord, ce qui pourrait expliquer pourquoi ma réponse ne fonctionne pas pour vous. Avez-vous certaines exigences qui vous limitent à 2.0? Si ce n'est pas le cas, il pourrait être utile de se pencher sur la mise à niveau. – Adkins

+0

Désolé pour cela. J'ai mis à jour mon entrée. Je vous remercie. –

4

Vous essayez de supprimer un noeud directement de l'élément de document, alors qu'il s'agit en réalité d'un arrière petit-enfant de l'élément document (ou peut-être simplement d'un petit-enfant). RemoveChild ne fonctionne que lorsque vous spécifiez un enfant direct, et pas seulement un descendant.

Essayez ceci:

nodeName.ParentNode.RemoveChild(nodeName); 

(Si Remove() existe selon la réponse de Adkins, ce serait mieux - mais je ne peux pas trouver une telle méthode dans MSDN.)

+0

Espérons que 'nodeName.ParentNode' n'est pas' null' ... – Scoregraphic

+0

il existe si vous utilisez Linq en XML. J'ai élargi un peu ma réponse pour le couvrir. – Adkins

+0

J'ai lu un autre réservé nommé "Pro .NET 2.0 XML".J'ai suivi l'exemple de code pour écrire dans mon code d'origine. Mais l'exemple de fichier xml n'est pas complexe comme le mien. Comme Jon 'réponds. Mon élément devrait être l'arrière-petit-fils de l'élément document. +1 et merci. –

3

Vous devez retirer l'enfant du parent immédiat, pas du haut:

nodeName.ParentNode.RemoveChild(nodeName);