Помилка: "Вузол, який потрібно вставити, є з іншого контексту документа"


109

Коли я телефоную XmlNode.AppendChild(), я отримую цю помилку:

Вузол, який потрібно вставити, є з іншого контексту документа.

static public XmlNode XMLNewChildNode(XmlNode oParent, string sName, 
    string sNamespaceURI, string sNodeType)
{
    XmlNode oNode = moDoc.CreateNode(sNodeType, sName, sNamespaceURI);
    oParent.AppendChild(oNode);
    return oNode;
}

Цей код був перетворений з його VB 6.0 версії, яка була такою (будь ласка, ігноруйте необов'язкові параметри, у мене є перевантаження в C # версії):

Public Function XMLNewChildNode(ByVal oParent As IXMLDOMNode, ByVal _
    sName As String, Optional ByVal sNamespaceURI As String = "", _
    Optional ByVal sNodeType As String = "element") As IXMLDOMNode
'**************** DESCRIPTION *******************
  'Create a new Child Node for passed Parent.
'***************** VARIABLES ********************
  Dim oNode As IXMLDOMNode
'************************************************
  Set oNode = moDoc.createNode(sNodeType, sName, sNamespaceURI)
  Call oParent.appendChild(oNode)
  Set XMLNewChildNode = oNode
End Function

Чому код VB працює, коли C # не працює? Чи є відмінності між тим, як VB і C # обробляють XML, про що мені потрібно знати?

Відповіді:


202

Потрібно імпортувати вузол у документ перед його додаванням:

XmlNode oNode = moDoc.CreateNode(sNodeType, sName, sNamespaceURI);

//necessary for crossing XmlDocument contexts
XmlNode importNode = oParent.OwnerDocument.ImportNode(oNode, true);

oParent.AppendChild(importNode);
return oNode;

1
Дякую, сер! ImportNode приймає два парами ... другий - для deepClone ... Як я можу вирішити, чи повинен я передати йому True чи False?
Bohn

7
@BDotA вірно, якщо потрібно імпортувати вузол та всіх його дітей; false, якщо ви просто хочете імпортувати вузол верхнього рівня.
Рекс М

1
Налагодження @BDotA і з’ясувати, який об’єкт є нульовим
Rex M

16
якщо OwnerDoccumentнуль; ImportNode(..слід закликати oParent?
Собака Вуха

9
... так,oParent.ImportNode(oNode, true);
KCD
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.