Tentando usar o removeChild () no xmlnodelist estragar minha coleção XMLNode
-
21-09-2019 - |
Pergunta
Estou tentando remover um nó específico de uma lista de XMLNodelist chamada LateAwidths. Esta lista específica possui 5 itens antes de usar removeChild (). Mas, após a declaração removeChild (), a lista permanece apenas com 1 item.
XmlNodeList listaWidths = xmlDoc.SelectNodes("/MsBuild:Report/MsBuild:Body/MsBuild:ReportItems/MsBuild:Tablix/MsBuild:TablixBody/MsBuild:TablixColumns/*", nsmgr);
int indexEpoca = 0;
XmlNode node = listaWidths[indexEpoca];
XmlNode parent = listaWidths[indexEpoca].ParentNode;
parent.RemoveChild(node);
Este é um XML de serviços de relatórios RDL. O código XML específico está aqui:
<Tablix Name="Tablix3">
<TablixBody>
<TablixColumns>
<TablixColumn>
<Width>1.602in</Width>
</TablixColumn>
<TablixColumn>
<Width>1.61in</Width>
</TablixColumn>
<TablixColumn>
<Width>1.6323in</Width>
</TablixColumn>
<TablixColumn>
<Width>1.6023in</Width>
</TablixColumn>
<TablixColumn>
<Width>1.6033in</Width>
</TablixColumn>
</TablixColumns>
(...)
Eu tentei todas as combinações possíveis, sem sorte. O que estou fazendo errado? Obrigada.
Solução
A documentação do selectNodes Diz claramente: "O objeto xmlnodelist retornado por esse método será válido enquanto o documento subjacente permanecer inalterado. Se o documento subjacente mudar, resultados inesperados poderão ser retornados (nenhuma exceção será lançada)".
Então, o que você experimenta com o seu XMLNodelist retornou do SelectNodes depois de manipular o documento pode não ser o que você espera, mas está alinhado com a documentação. Você precisará ligar para o SelectNodes novamente para obter uma nova lista de XMLNodelist se manipular o documento.
Na minha opinião, os designers da implementação do DOM na estrutura .NET cometeram um erro usando o XMLNodelist como uma classe abstrata para implementação concreta com comportamento bem diferente. Se você usar o EG ChildNodes, obtenha uma lista de nós "ao vivo" de acordo com o que a especificação W3C DOM exige, nesse caso, uma alteração de documento altera automaticamente a lista de nós (se necessário). No entanto, o SelectNodes retorna uma lista de nós com um comportamento bem diferente, como você experimentou.