Hata: "Eklenecek düğüm farklı bir belge içeriğinden geliyor"


109

Aradığımda XmlNode.AppendChild()şu hatayı alıyorum:

Eklenecek düğüm farklı bir belge bağlamından.

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

Bu kod, şu olan VB 6.0 sürümünden dönüştürüldü (lütfen isteğe bağlı parametreleri dikkate almayın, C # sürümünde onlar için aşırı yüklerim var):

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

C # çalışmıyorken VB kodu neden çalışıyor? VB ve C # 'nin XML'i işleme şekli arasında farkında olmam gereken farklılıklar var mı?

Yanıtlar:


202

Düğümü eklemeden önce belgeye aktarmanız gerekir:

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
Teşekkürler efendim! ImportNode iki parametre alır ... ikincisi deepClone içindir ... Buna Doğru mu yoksa Yanlış mı geçmem gerektiğine nasıl karar verebilirim?
Bohn

7
Düğümü ve tüm alt öğelerini içe aktarmak istiyorsanız @BDotA true; Yalnızca üst düzey düğümü içe aktarmak istiyorsanız false.
Rex M

1
@BDotA hata ayıklama ve hangi nesnenin boş olduğunu anlama
Rex M

16
Eğer OwnerDoccumentboş; ImportNode(..çağrılmalı oParentmı?
Dog Ears

9
... evet,oParent.ImportNode(oNode, true);
KCD
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.