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.

Foi útil?

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.

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