ข้อผิดพลาด:“ โหนดที่จะแทรกมาจากบริบทเอกสารอื่น”


109

เมื่อฉันโทรหาXmlNode.AppendChild()ฉันได้รับข้อผิดพลาดนี้:

โหนดที่จะแทรกมาจากบริบทเอกสารอื่น

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

รหัสนี้ถูกแปลงจากเวอร์ชัน VB 6.0 ซึ่งเป็นรหัสนี้ (โปรดละเว้นพารามิเตอร์ที่เป็นทางเลือกฉันมีโอเวอร์โหลดสำหรับพวกเขาในเวอร์ชัน 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

เหตุใดรหัส VB ​​จึงทำงานในขณะที่ C # ไม่ทำงาน มีความแตกต่างระหว่างวิธีที่ VB และ C # จัดการ XML ที่ฉันต้องระวังหรือไม่

คำตอบ:


203

คุณต้องนำเข้าโหนดลงในเอกสารก่อนที่จะต่อท้าย:

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
ขอบคุณครับ! ImportNode ใช้เวลาสองพารามิเตอร์ ... อันที่สองใช้สำหรับ deepClone ... ฉันจะตัดสินใจได้อย่างไรว่าฉันควรจะส่งผ่านจริงหรือเท็จ
Bohn

7
@BDotA true หากคุณต้องการนำเข้าโหนดและลูกทั้งหมด เท็จหากคุณต้องการเพียงแค่นำเข้าโหนดระดับบนสุด
Rex M

1
@BDotA ดีบักและค้นหาว่าวัตถุใดเป็นโมฆะ
Rex M

16
ถ้าOwnerDoccumentเป็นโมฆะ ImportNode(..ควรเรียกว่าoParent?
Dog Ears

9
... ครับoParent.ImportNode(oNode, true);
KCD
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.