Domanda

Sto cercando di rimuovere un nodo specifico da un XmlNodeList nome listaWidths. Questo elenco specifico ha 5 articoli prima di usare RemoveChild (). Ma, dopo l'istruzione RemoveChild (), la lista rimane solo 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);

Questo è un XML RDL di Reporting Services. Il codice XML specifico è qui:

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

Ho provato tutte le combinazioni possibili, senza fortuna di sorta. Che cosa sto facendo di sbagliato? Grazie.

È stato utile?

Soluzione

La documentazione di SelectNodes chiaramente dice: "L'oggetto XmlNodeList restituito da questo metodo sarà valida fino ad esaurimento del documento sottostante rimane invariato. Se il sottostante documento cambia, i risultati imprevisti possono essere restituiti (verrà generata un'eccezione) ".

Quindi, quello che si verificano con il vostro XmlNodeList tornato da SelectNodes dopo di manipolare il documento potrebbe non essere quello che ci si aspetta, ma è in linea con la documentazione. Dovrete chiamare SelectNodes di nuovo per ottenere una nuova XmlNodeList se si manipola il documento.

A mio avviso i progettisti della implementazione DOM in .NET Framework commesso un errore utilizzando XmlNodeList come una classe astratta per l'attuazione concreta con un comportamento molto diverso. Se si utilizza per esempio ChildNodes allora si ottiene una lista dei nodi "live" in linea con quanto la specifica W3C DOM richiede quindi in questo caso un cambiamento del documento cambia automaticamente la lista dei nodi (se necessario). Tuttavia SelectNodes restituisce un elenco di nodi con un comportamento molto diverso, come avete sperimentato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top