Kesalahan: "Node yang akan disisipkan berasal dari konteks dokumen yang berbeda"

109

Ketika saya menelepon XmlNode.AppendChild(), saya mendapatkan kesalahan ini:

Node yang akan disisipkan berasal dari konteks dokumen yang berbeda.

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

Kode ini diubah dari versi VB 6.0-nya yang ini (abaikan parameter opsional, saya memiliki kelebihan untuk mereka dalam versi 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

Mengapa kode VB bekerja sedangkan C # tidak? Apakah ada perbedaan antara cara VB dan C # menangani XML, yang perlu saya waspadai?

Bohn
sumber

Jawaban:

202

Anda perlu mengimpor node ke dalam dokumen sebelum menambahkannya:

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
sumber
1
Terima kasih tuan! ImportNode membutuhkan dua params ... yang kedua adalah untuk deepClone ... Bagaimana saya bisa memutuskan apakah saya harus meneruskan True atau False untuk itu?
Bohn
7
@BDotA true jika Anda ingin mengimpor node dan semua turunannya; false jika Anda hanya ingin mengimpor node tingkat atas.
Rex M
1
@BDotA debug dan cari tahu objek mana yang nol
Rex M
16
jika OwnerDoccumentnol; ImportNode(..harus dipanggil oParent?
Dog Ears
9
... ya,oParent.ImportNode(oNode, true);
KCD