Fehler: "Der einzufügende Knoten stammt aus einem anderen Dokumentkontext."

108

Wenn ich anrufe XmlNode.AppendChild(), erhalte ich folgende Fehlermeldung:

Der einzufügende Knoten stammt aus einem anderen Dokumentkontext.

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

Dieser Code wurde von seiner VB 6.0-Version konvertiert, die dies war (bitte ignorieren Sie die optionalen Parameter, ich habe Überladungen für sie in der C # -Version):

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

Warum funktioniert der VB-Code, während das C # nicht funktioniert? Gibt es Unterschiede zwischen dem Umgang von VB und C # mit XML, die ich beachten muss?

Bohn
quelle

Antworten:

200

Sie müssen den Knoten in das Dokument importieren, bevor Sie ihn anhängen:

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.
quelle
1
Vielen Dank, Sir! ImportNode benötigt zwei Parameter ... der zweite ist für deepClone ... Wie kann ich entscheiden, ob ich True oder False an ihn übergeben soll?
Bohn
7
@BDotA true, wenn Sie den Knoten und alle seine untergeordneten Knoten importieren möchten. false, wenn Sie nur den Knoten der obersten Ebene importieren möchten.
Rex M
1
@ BDotA debuggen und herausfinden, welches Objekt null ist
Rex M
16
if OwnerDoccumentist null; ImportNode(..sollte angerufen werden oParent?
Hundeohren
9
... ja,oParent.ImportNode(oNode, true);
KCD