Pergunta

O código a seguir deve encontrar a tag de projeto apropriada e removê-la do XmlDocument, porém, quando eu testo, ele diz:

O nó a ser removido não é filho deste nó.

Alguém sabe a maneira correta de fazer isso?

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

ATUALIZAR

Fixo.Eu fiz duas coisas:

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

Substituiu o loop For por uma consulta XPath, que não servia para corrigi-lo, apenas porque era uma abordagem melhor.

A correção real foi:

project.ParentNode.RemoveChild(project);

Obrigado Pat e Chuck por esta sugestão.

Foi útil?

Solução

Em vez de

configDoc.RemoveChild(projectNodes[i]);

tentar

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

Outras dicas

tentar

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

Parece que você precisa selecionar o nó pai de projectNodes[i] antes de chamar RemoveChild.

É possível que os nós do projeto não sejam nós filhos, mas netos ou inferiores?GetElementsByTagName fornecerá elementos de qualquer lugar na árvore de elementos filhos, IIRC.

Quando você ficar suficientemente irritado ao escrever o caminho longo (para mim, isso foi muito em breve), você pode usar um método de extensão auxiliar fornecido abaixo.Viva, nova tecnologia!

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

Seria útil ver uma amostra do arquivo XML que você está processando, mas acho que você tem algo assim

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

A mensagem de erro parece ser porque você está tentando remover <project> do avô em vez do pai direto do nó do projeto

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top