Error: "El nodo que se va a insertar es de un contexto de documento diferente"

109

Cuando llamo XmlNode.AppendChild(), obtengo este error:

El nodo que se va a insertar es de un contexto de documento diferente.

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

Este código se convirtió de su versión VB 6.0, que era esta (ignore los parámetros opcionales, tengo sobrecargas en la versión 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

¿Por qué funciona el código VB mientras que el C # no? ¿Existen diferencias entre la forma en que VB y C # manejan XML, que debo tener en cuenta?

Bohn
fuente

Respuestas:

202

Debe importar el nodo en el documento antes de agregarlo:

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

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

oParent.AppendChild(importNode);
return oNode;
Rex M
fuente
1
¡Gracias Señor! ImportNode toma dos parámetros ... el segundo es para deepClone ... ¿Cómo puedo decidir si debo pasarle Verdadero o Falso?
Bohn
7
@BDotA true si desea importar el nodo y todos sus hijos; false si solo desea importar el nodo de nivel superior.
Rex M
1
@BDotA depura y averigua qué objeto es nulo
Rex M
16
si OwnerDoccumentes nulo; ImportNode(..debe ser llamado oParent?
Dog Ears
9
... sí,oParent.ImportNode(oNode, true);
KCD