Erreur: "Le nœud à insérer provient d'un autre contexte de document"

109

Lorsque j'appelle XmlNode.AppendChild(), j'obtiens cette erreur:

Le nœud à insérer provient d'un contexte de document différent.

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

Ce code a été converti à partir de sa version VB 6.0 qui était la suivante (veuillez ignorer les paramètres facultatifs, j'ai des surcharges pour eux dans la version 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

Pourquoi le code VB fonctionne-t-il alors que le C # ne fonctionne pas? Y a-t-il des différences entre la façon dont VB et C # gèrent XML, dont je dois être conscient?

Bohn
la source

Réponses:

202

Vous devez importer le nœud dans le document avant de l'ajouter:

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
la source
1
Merci Monsieur! ImportNode prend deux paramètres ... le second est pour deepClone ... Comment puis-je décider si je dois lui passer True ou False?
Bohn
7
@BDotA true si vous souhaitez importer le nœud et tous ses enfants; false si vous souhaitez simplement importer le nœud de niveau supérieur.
Rex M
1
Déboguer @BDotA et déterminer quel objet est nul
Rex M
16
si OwnerDoccumentest nul; ImportNode(..devrait être appelé oParent?
Dog Ears
9
... oui,oParent.ImportNode(oNode, true);
KCD