エラー:「挿入されるノードは別のドキュメントコンテキストからのものです」


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

C#が機能しないのにVBコードが機能するのはなぜですか?VBとC#でXMLを処理する方法に違いがあることに注意してください。

回答:


202

追加する前に、ノードをドキュメントにインポートする必要があります。

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は2つのパラメーターを受け取ります。2つ目はdeepClone用です。TrueとFalseのどちらを渡す必要があるかをどのように判断できますか?
ボーン

7
@BDotAノードとそのすべての子をインポートする場合はtrue。トップレベルのノードのみをインポートする場合はfalse。
レックスM

1
@BDotAは、どのオブジェクトがnullであるかをデバッグして把握します
Rex M

16
OwnerDoccumentがnullの場合。ImportNode(..呼び出す必要がありoParentますか?
Dog Ears

9
...はい、oParent.ImportNode(oNode, true);
KCD 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.