XmlDocument からのノードの削除
-
09-06-2019 - |
質問
次のコードは、適切なプロジェクト タグを見つけて 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>
プロジェクト ノードの直接の親ではなく、祖父母から
所属していません StackOverflow