Lỗi: "Nút được chèn từ một ngữ cảnh tài liệu khác"


109

Khi tôi đang gọi XmlNode.AppendChild(), tôi gặp lỗi này:

Nút sẽ được chèn từ một ngữ cảnh tài liệu khác.

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

Mã này được chuyển đổi từ phiên bản VB 6.0 của nó (vui lòng bỏ qua các tham số tùy chọn, tôi có quá tải cho chúng trong phiên bản 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

Tại sao mã VB hoạt động trong khi C # thì không? Có sự khác biệt nào giữa cách VB và C # xử lý XML mà tôi cần biết không?

Câu trả lời:


202

Bạn cần nhập nút vào tài liệu trước khi thêm vào:

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
Cảm ơn ngài! ImportNode có hai tham số ... tham số thứ hai dành cho deepClone ... Làm cách nào tôi có thể quyết định xem mình nên chuyển Đúng hay Sai cho nó?
Bohn

7
@BDotA true nếu bạn muốn nhập nút và tất cả các nút con của nó; false nếu bạn chỉ muốn nhập nút cấp cao nhất.
Rex M

1
@BDotA debug và con ra mà đối tượng là null
Rex M

16
nếu OwnerDoccumentlà null; ImportNode(..nên được gọi vào oParent?
Dog Ears

9
... vâng,oParent.ImportNode(oNode, true);
KCD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.