Frage

Ich versuche, einen bestimmten Knoten aus einem XmlNodeList namens listaWidths zu entfernen. Diese spezielle Liste hat 5 Punkte, bevor ich RemoveChild () verwenden. Aber nach der RemoveChild () Anweisung, die Liste bleibt nur 1 Punkt.

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

Dies ist ein RDL Berichterstattung XML Services. Der spezifische XML-Code ist hier:

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

Ich habe jede Kombination möglich versucht, ohne Glück überhaupt. Was mache ich falsch? Danke.

War es hilfreich?

Lösung

Die Dokumentation von Select deutlich sagt: „Das XmlNodeList Objekt zurückgegeben wird durch diese Methode gültig sein, während das zugrunde liegende Dokument unverändert bleibt. Wenn das zugrunde liegende Dokument ändert, können unerwartete Ergebnisse (keine Ausnahme wird geworfen) zurückgeführt werden. "

Also, was Sie mit Ihrem XmlNodeList von Select zurückgegeben, nachdem Sie das Dokument manipulieren vielleicht nicht, was Sie erwarten, sondern sind mit der Dokumentation in der Schlange. Sie müssen Select rufen wieder einen neuen XmlNodeList zu erhalten, wenn Sie das Dokument zu manipulieren.

Aus meiner Sicht der Designer der DOM-Implementierung im .NET Framework einen Fehler gemacht von XmlNodeList als abstrakter Klasse für die konkrete Umsetzung mit ganz unterschiedlichen Verhalten verwenden. Wenn Sie zum Beispiel Childnodes dann erhalten Sie eine „live“ Knotenliste im Einklang mit dem, was die W3C DOM-Spezifikation erfordert, so dass in diesem Fall ein Dokument Änderung die Knotenliste automatisch ändert (falls erforderlich). Jedoch Select gibt eine Knotenliste mit einem ganz anderen Verhalten, wie Sie erlebt haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top