Ошибка функции RemoveChild (узел XmlNode) в C#

Когда я пытаюсь удалить некоторые из моих дочерних элементов с помощью RemoveChild(). Но выбросьте исключение. Я прикрепил свой код ниже.

    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

Показать ошибку ниже:

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. 

Как удалить узел?

[Обновление]

Используются VS2005 и .NET 2.0.


person Nano HE    schedule 06.07.2010    source источник
comment
Кажется, что дочерний узел, когда он выбран, не связан с его родительским экземпляром, из которого он был создан. Это кажется мне ошибкой. Исправление состоит в том, чтобы сделать (как сказали другие): childNode.ParentNode.RemoveChild(childNode)   -  person Josh M.    schedule 10.07.2012


Ответы (4)


Я считаю, что .RemoveChild удаляет дочерний элемент выбранного вами узла.

Есть ли дети до nodeName или это уже лист?

Редактировать:

На самом деле вам нужно удалить дочерний элемент родителя, попробуйте следующее:

nodeName.parentNode.removeChild(nodeName)
person Trefex    schedule 06.07.2010

Вы пытаетесь удалить узел непосредственно из элемента документа, хотя на самом деле он является правнуком элемента документа (или, может быть, просто внуком). RemoveChild работает только тогда, когда вы указываете прямого дочернего элемента, а не любого потомка.

Попробуй это:

nodeName.ParentNode.RemoveChild(nodeName);

(Если Remove() существует в соответствии с ответом Адкинса, это было бы лучше, но я не могу найти такой метод в MSDN.)

person Jon Skeet    schedule 06.07.2010
comment
он существует, если вы используете Linq to XML. Я немного расширил свой ответ, чтобы охватить его. - person Christopher B. Adkins; 06.07.2010
comment
Я читал еще один заказ под названием Pro .NET 2.0 XML. Я следовал образцу кода, чтобы написать исходный код. Но образец XML-файла не такой сложный, как мой. Как ответ Джона. Мой элемент должен быть правнуком элемента документа. +1 и спасибо. - person Nano HE; 06.07.2010
comment
@Эдкинс. Я добавил защиту типа if (node != null) { // do ...} - person Nano HE; 06.07.2010

Вы должны удалить дочерний элемент из непосредственного родителя, а не сверху:

nodeName.ParentNode.RemoveChild(nodeName); 
person unbeli    schedule 06.07.2010

Вместо использования .RemoveChild попробуйте просто использовать .Remove That, который должен дать вам результат, который вы ищете.

Редактировать::

Обратите внимание, что это работает, только если вы используете Linq to XML. Тогда вы будете работать с какой-то вариацией XNode и можете просто сказать blah.Remove, и это должно помочь. Если вы не используете Linq to XML, я бы посоветовал изучить это, потому что это потрясающе.

person Christopher B. Adkins    schedule 06.07.2010
comment
Нет метода Remove(), основанного на моем VS2005 и .NET 2.0. :-) - person Nano HE; 06.07.2010
comment
@Nano: Linq впервые появился с .NET 3.5 (?), Возможно, поэтому мой ответ вам не подходит. У вас есть определенные требования, которые ограничивают вас до версии 2.0? Если нет, возможно, стоит задуматься об обновлении. - person Christopher B. Adkins; 06.07.2010