Pregunta

Estoy intentando quitar un nodo específico de una XmlNodeList llamado listaWidths. Esta lista tiene 5 items específica antes de utilizar removeChild (). Pero, después de la declaración removeChild (), la lista única estancias con 1 punto.

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 es un XML RDL Reporting Services. El código específico de XML está aquí:

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

He intentado todas las combinaciones posibles, sin ningún tipo de suerte. ¿Qué estoy haciendo mal? Gracias.

¿Fue útil?

Solución

La documentación de SelectNodes dice claramente: "El objeto XmlNodeList devuelto por este método será válido mientras el documento subyacente permanece sin cambios. Si los cambios documento subyacente, resultados inesperados se pueden devolver (sin excepción será lanzada) ".

Así que lo que se experimenta con su XmlNodeList regresar de SelectNodes después de manipular el documento podría no ser lo que se espera, pero está en línea con la documentación. Tendrá que llamar SelectNodes de nuevo para obtener un nuevo XmlNodeList si se manipula el documento.

En mi opinión, los diseñadores de la implementación DOM en el marco .NET cometió un error mediante el uso de XmlNodeList como una clase abstracta para la aplicación concreta con un comportamiento bastante diferente. Si se utiliza, por ejemplo, ChildNodes continuación, se obtiene una lista de nodos "en vivo" en línea con lo que la especificación del W3C DOM requiere por lo que en caso de que un cambio documento cambia automáticamente la lista de nodos (si es necesario). Sin embargo SelectNodes devuelve una lista de nodos con un comportamiento bastante diferente, ya que ha experimentado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top