Errore: "Il nodo da inserire proviene da un contesto di documento diverso"


109

Quando chiamo XmlNode.AppendChild(), ricevo questo errore:

Il nodo da inserire proviene da un contesto di documento diverso.

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

Questo codice è stato convertito dalla sua versione VB 6.0 che era questa (ignora i parametri opzionali, ho sovraccarichi per loro nella versione 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

Perché il codice VB funziona mentre il C # no? Ci sono differenze tra il modo in cui VB e C # gestiscono XML, di cui devo essere a conoscenza?

Risposte:


202

È necessario importare il nodo nel documento prima di aggiungerlo:

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
Grazie Signore! ImportNode prende due parametri ... il secondo è per deepClone ... Come posso decidere se passare True o False ad esso?
Bohn

7
@BDotA true se si desidera importare il nodo e tutti i suoi figli; false se desideri importare solo il nodo di primo livello.
Rex M

1
@BDotA esegue il debug e individua quale oggetto è nullo
Rex M

16
se OwnerDoccumentè nullo; ImportNode(..dovrebbe essere chiamato oParent?
Orecchie di cane

9
... sì,oParent.ImportNode(oNode, true);
KCD
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.