C # openxml Entfernen des Absatzes

8

Ich versuche, einen Absatz zu entfernen (ich verwende einen Platzhaltertext, um eine docx-Vorlage zu erstellen) aus einer .docx-Datei mit OpenXML, aber wenn ich einen Absatz entferne, bricht er die foreach-Schleife, mit der ich arbeite iterieren durch.

%Vor%

Dies funktioniert, entfernt den Platzhalter und den Absatz, in dem es sich befindet, aber die foreach-Schleife beendet die Iteration . Und ich brauche mehr Dinge in meiner foreach Schleife.

Ist das ok Weg, Absatz in C # mit OpenXML zu entfernen und Warum stoppt meine foreach-Schleife oder wie man es nicht stoppen ? Danke.

    
edin-m 26.03.2012, 16:20
quelle

3 Antworten

10

Dies ist das "Halloween-Problem", so genannt, weil es von einigen Entwicklern an Halloween bemerkt wurde, und es sah für sie unheimlich aus. Es ist das Problem, deklarativen Code (Abfragen) mit imperativem Code (Knoten löschen) gleichzeitig zu verwenden. Wenn Sie darüber nachdenken, durchlaufen Sie eine verknüpfte Liste, und wenn Sie anfangen, Knoten in der verknüpften Liste zu löschen, durcheinander bringen Sie den Iterator völlig durcheinander. Eine einfachere Möglichkeit, dieses Problem zu vermeiden, besteht darin, die Ergebnisse der Abfrage in einer Liste zu "materialisieren". Anschließend können Sie die Liste durchlaufen und Knoten nach Belieben löschen. Der einzige Unterschied im folgenden Code ist, dass es ToList nach dem Aufruf der Nachkommen-Achse aufruft.

%Vor%

Allerdings muss ich feststellen, dass ich einen anderen Fehler in Ihrem Code sehe. Es gibt nichts, was Word daran hindern könnte, diesen Textknoten in mehrere Textelemente von mehreren Läufen aufzuteilen. In den meisten Fällen wird Ihr Code gut funktionieren, früher oder später werden Sie oder ein Benutzer etwas unternehmen (wie das Auswählen eines Charakters und versehentliches Drücken der fettgedruckten Schaltfläche in der Multifunktionsleiste) und dann funktioniert Ihr Code nicht mehr.

Wenn Sie wirklich auf Textebene arbeiten möchten, müssen Sie Code verwenden, wie ich ihn in diesem Screen-Cast vorstelle: Ссылка

Tatsächlich könnten Sie diesen Code wörtlich verwenden, um Ihren Anwendungsfall zu handhaben, glaube ich.

Ein anderer Ansatz, flexibler und leistungsfähiger, ist detailliert in:

Ссылка

Bei diesem Screencast geht es um PresentationML, doch gelten die gleichen Prinzipien auch für WordprocessingML.

Aber noch besser, wenn Sie WordprocessingML verwenden, ist die Verwendung von Inhaltssteuerelementen. Für einen Ansatz zur Dokumentengenerierung, siehe:

Ссылка

Und viele weitere Informationen zur Verwendung von Inhaltssteuerelementen im Allgemeinen finden Sie unter:

Ссылка

-Eric

    
Eric White 27.03.2012, 07:52
quelle
1

Sie müssen zuerst zwei Zyklen verwenden, die Elemente speichern, die Sie löschen möchten, und dann zwei, die Elemente löschen. etwas wie das:

%Vor%     
Denis Palnitsky 26.03.2012 16:31
quelle
0
%Vor%     
negini 22.08.2013 12:06
quelle

Tags und Links