错误:“要插入的节点来自不同的文档上下文”

Error: "The node to be inserted is from a different document context"

提问人:Bohn 提问时间:6/11/2010 最后编辑:Ian KempBohn 更新时间:2/26/2020 访问量:97366

问:

当我打电话时,我收到以下错误: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 的方式之间是否存在我需要注意的差异?

C# XML

评论


答:

229赞 Rex M 6/11/2010 #1

在附加节点之前,您需要将节点导入到文档中:

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赞 Bohn 6/11/2010
谢谢先生!ImportNode 需要两个参数...第二个是针对deepClone的...我怎样才能决定我应该将 True 还是 False 传递给它?
7赞 Rex M 6/11/2010
如果要导入节点及其所有子节点,则@BDotA true;如果只想导入顶级节点,则为 false。
17赞 Dog Ears 2/24/2011
如果为 null; 应该被召唤吗?OwnerDoccumentImportNode(..oParent
10赞 KCD 3/15/2013
...是的oParent.ImportNode(oNode, true);
2赞 Vincenzo 3/11/2016
OwnerDocument 对我来说不是必需的。只是 oParent.ImportNode(oNode, true);够了