Question

Je suis en train de supprimer un nœud spécifique d'un listaWidths de XmlNodeList nommé. Cette liste spécifique a 5 articles avant de l'utiliser RemoveChild (). Mais, après la déclaration RemoveChild (), la liste reste seulement 1 point.

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

Ceci est un XML Reporting Services RDL. Le code XML spécifique est ici:

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

J'ai essayé toutes les combinaisons possibles, sans chance que ce soit. Qu'est-ce que je fais mal? Merci.

Était-ce utile?

La solution

La documentation de SelectNodes dit clairement: « L'objet XmlNodeList renvoyée par cette méthode sera valide tant que le document sous-jacent reste inchangé. Si les modifications des documents sous-jacents, des résultats inattendus peuvent être renvoyés (pas d'exception sera levée). "

Alors, que vous rencontrez avec votre retour de XmlNodeList SelectNodes après avoir manipuler le document pourrait ne pas être ce que vous attendez, mais est conforme à la documentation. Vous devrez appeler à nouveau SelectNodes pour obtenir un nouveau XmlNodeList si vous manipuler le document.

Selon moi, les concepteurs de la mise en œuvre du DOM dans le cadre .NET fait une erreur en utilisant XmlNodeList comme une classe abstraite pour la mise en œuvre concrète avec un comportement tout à fait différent. Si vous utilisez par exemple ChildNodes vous obtiendrez alors une liste de noeud « en direct » en ligne avec ce que la spécification DOM du W3C exige dans ce cas, un changement de documents change automatiquement la liste des nœuds (le cas échéant). Cependant SelectNodes retourne une liste de noeuds avec un comportement tout à fait différent, comme vous avez vécu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top