2008-08-21 206 views
39

下面的代码应该找到合适的项目标签,并从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); 
      } 
     } 
    } 
} 

UPDATE

固定。我做了两两件事:

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

取代了对于用XPath查询,这是不固定循环播放,只因为它是一个更好的办法。

实际修复是:

project.ParentNode.RemoveChild(project); 

感谢帕特和Chuck这一建议。

+0

我一直在寻找这件事。我花了半天的时间在网上查找xml文件,并在SO上查了半分钟。杰夫和乔尔谈到某件事的另一个原因。 – 2009-12-07 19:29:05

回答

53

改为移除<project>尝试

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

有没有可能项目节点不是子节点,而是孙子或更低? GetElementsByTagName将为您提供来自子元素树IIRC中任何位置的元素。

0

这将是很方便的看到你正在处理XML文件的样本,但我的猜测是,你有这样的事情

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

该错误消息似乎是因为你试图从祖父母,而不是项目节点的

configDoc.RemoveChild(projectNodes[i]); 

直接父

2

尝试

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

看起来你需要在调用removeChild之前选择projectNodes [I]的父节点。

0

当你写得很充满烦恼(对于我来说很快),你可以使用下面提供的助手扩展方法。耶新技术!

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();