Ошибка: «Вставляемый узел из другого контекста документа»


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 true, если вы хотите импортировать узел и все его дочерние элементы; false, если вы просто хотите импортировать узел верхнего уровня.
Rex M

1
@BDotA отлаживает и выясняет, какой объект имеет значение NULL
Rex M

16
если OwnerDoccumentноль; ImportNode(..должен быть вызван oParent?
Dog Ears

9
... да,oParent.ImportNode(oNode, true);
KCD
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.