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

Boh*_*ohn 101 c# xml

当我打电话时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;
}
Run Code Online (Sandbox Code Playgroud)

这段代码是从它的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
Run Code Online (Sandbox Code Playgroud)

为什么VB代码工作而C#没有?VB和C#如何处理XML之间是否存在差异,我需要注意哪些?

Rex*_*x M 188

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

XmlNode oNode = moDoc.CreateNode(sNodeType, sName, sNamespaceURI);

//necessary for crossing XmlDocument contexts
XmlNode importNode = oParent.OwnerDocument.ImportNode(oNode, true);

oParent.AppendChild(importNode);
return oNode;
Run Code Online (Sandbox Code Playgroud)

  • 如果`OwnerDoccument`为null; `importNode(..`应该在`oParent`上调用? (15认同)
  • ...是的,`oParent.ImportNode(oNode,true);` (8认同)
  • @BDot如果要导入节点及其所有子节点,则为true;否则为false.如果您只想导入顶级节点,则返回false. (7认同)
  • OwnerDocument 对我来说不是必需的。只需 oParent.ImportNode(oNode, true); 就足够了 (2认同)