Błąd: „Węzeł do wstawienia pochodzi z innego kontekstu dokumentu”


109

Kiedy dzwonię XmlNode.AppendChild(), pojawia się ten błąd:

Węzeł, który ma zostać wstawiony, pochodzi z innego kontekstu dokumentu.

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

Ten kod został przekonwertowany z wersji VB 6.0, która była następująca (proszę zignorować parametry opcjonalne, mam dla nich przeciążenia w wersji 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

Dlaczego kod VB działa, a C # nie? Czy istnieją różnice między sposobem obsługi XML w języku VB i C #, o których należy wiedzieć?

Odpowiedzi:


202

Musisz zaimportować węzeł do dokumentu przed jego dołączeniem:

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
Dziekuje panu! ImportNode pobiera dwa parametry ... drugi jest dla deepClone ... Jak mogę zdecydować, czy powinienem przekazać do niego True czy False?
Bohn

7
@BDotA prawda, jeśli chcesz zaimportować węzeł i wszystkie jego dzieci; false, jeśli chcesz tylko zaimportować węzeł najwyższego poziomu.
Rex M

1
@BDotA debuguj i dowiedz się, który obiekt jest pusty
Rex M

16
jeśli OwnerDoccumentjest null; ImportNode(..należy wezwać oParent?
Dog Ears

9
... tak,oParent.ImportNode(oNode, true);
KCD
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.