質問

次のコードは、適切なプロジェクト タグを見つけて XmlDocument から削除するはずですが、テストすると次のように表示されます。

削除するノードはこのノードの子ではありません。

誰かこれを行う適切な方法を知っていますか?

public void DeleteProject (string projectName)
{
    string ccConfigPath = ConfigurationManager.AppSettings["ConfigPath"];

    XmlDocument configDoc = new XmlDocument();

    configDoc.Load(ccConfigPath);

    XmlNodeList projectNodes = configDoc.GetElementsByTagName("project");

    for (int i = 0; i < projectNodes.Count; i++)
    {
        if (projectNodes[i].Attributes["name"] != null)
        {
            if (projectName == projectNodes[i].Attributes["name"].InnerText)
            {                                                
                configDoc.RemoveChild(projectNodes[i]);
                configDoc.Save(ccConfigPath);
            }
        }
    }
}

アップデート

修理済み。私は次の 2 つのことを行いました。

XmlNode project = configDoc.SelectSingleNode("//project[@name='" + projectName + "']");

For ループを XPath クエリに置き換えました。これは、それを修正するためではなく、より良いアプローチだったからです。

実際の修正は次のとおりです。

project.ParentNode.RemoveChild(project);

パットとチャック、この提案に感謝します。

役に立ちましたか?

解決

の代わりに

configDoc.RemoveChild(projectNodes[i]);

試す

projectNodes[i].parentNode.RemoveChild(projectNodes[i]);

他のヒント

試す

configDoc.DocumentElement.RemoveChild(projectNodes[i]);

RemoveChildを呼び出す前にprojectNodes[i]の親ノードを選択する必要があるようです。

プロジェクト ノードが子ノードではなく、孫ノードまたはそれ以下である可能性はありますか?GetElementsByTagName は、子要素ツリー IIRC の任意の場所から要素を取得します。

長く書くのにうんざりする場合 (私の場合はすぐに終わりました)、以下に提供されているヘルパー拡張メソッドを使用できます。やったー新技術!

public static class Extensions {
    ...
    public static XmlNode RemoveFromParent(this XmlNode node) {
        return (node == null) ? null : node.ParentNode.RemoveChild(node);
    }
}
...
//some_long_node_expression.parentNode.RemoveChild(some_long_node_expression);
some_long_node_expression.RemoveFromParent();

処理している XML ファイルのサンプルを見ると便利ですが、おそらく次のようなものがあると思います。

<Root>
 <Blah>
   <project>...</project>
 </Blah>
</Root>

エラー メッセージは、削除しようとしているためと思われます <project> プロジェクト ノードの直接の親ではなく、祖父母から

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top