Erro: “O nó a ser inserido é de um contexto de documento diferente”


109

Quando estou ligando XmlNode.AppendChild(), recebo este erro:

O nó a ser inserido pertence a um 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 foi convertido de sua versão VB 6.0 que era esta (ignore os parâmetros opcionais, tenho sobrecargas para eles na versão 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 que o código VB funciona enquanto o C # não? Existem diferenças entre como o VB e o C # lidam com XML, das quais preciso estar ciente?

Respostas:


202

Você precisa importar o nó para o documento antes de anexá-lo:

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
Obrigado senhor! ImportNode leva dois parâmetros ... o segundo é para deepClone ... Como posso decidir se devo passar True ou False para ele?
Bohn

7
@BDotA true se você deseja importar o nó e todos os seus filhos; false se você deseja apenas importar o nó de nível superior.
Rex M de

1
@BDotA depurar e descobrir qual objeto é nulo
Rex M de

16
se OwnerDoccumenté nulo; ImportNode(..deve ser chamado oParent?
Dog Ears

9
... sim,oParent.ImportNode(oNode, true);
KCD
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.