Löschen von bestimmten Abschnitten aus xml-Dateien (massenweise)

heidi-hoh

Cadet 3rd Year
Registriert
Okt. 2020
Beiträge
46
Moin,

ist leider so gar nicht meine Welt...:confused_alt:

Ich habe einen ganzen Haufen von xml-Dateien (xml 1.0 in Form von .gpx-Dateien).
Alle Dateien enthalten mehrfach (4 Stück hintereinander) einen Unterabschnitt in Form von:
...
<link href="https://www.gpsies.com/map.do?fileId=jhntbrcaenvihhld">
<type>trackOnWeb</type>
</link>
...

Problem: Die dort aufgeführten (teils sehr langen) Hyperlinks erscheinen beim Betrachten der gpx-Datei in meinem Lieblingsviewer im Mouseoverpopup und blähen diesen gewaltig auf. Das macht die Sache schnell unübersichtlich & die Info ist überflüssig & führt ohnehin ins Leere. (Das sind meine Rad- und Wandertracks aus einem Onlineplaner, der leider irgendwann dicht gemacht hat)

Ich kann diese Abschnitte problemlos mit Texteditor aus der xml löschen und dann ist alles gut.
Problem: Ich müsste das jetzt bei Unmengen von Dateien machen, das dauert ewig.

Kann da wer irgendeine Batch klöppeln, welche ich über ein Verzeichnis rüberlaufen lassen kann?
Oder irgendeinen anderen Trick.
Wäre dankbar.

Dirk
 
Hört sich für mich an, dass man dies gut beispielsweise mit dem Notepad++, "Suche&Ersetzen" in Files und Regex lösen könnte
 
  • Gefällt mir
Reaktionen: aroxx und floq0r
Oder in Visual Studio Code den Ordner mit allen XML Dateien öffnen und dann dort über das globale suchen und ersetzen, dass greift dann in allen Dateien.
 
Sorry, Wochenende nahm anderen Verlauf....

Wenn ich das richtig verstehe komme ich aber um ein Öffnen der Dateien Stück für Stück nicht herum?
Visual Studio oder irgendwas Spezielles habe ich nicht.

@Nebuk
Regex meint was?
Ergänzung ()

OK, Notpad++ dann doch über mehrere Files.
Ich schau mal.
 
Zuletzt bearbeitet:
@kim88, OK.
Habe jetzt mal mit Notepad++ angefangen. Da musste ich nichts installieren.

Über den ganzen Ordner S&E habe ich dort soweit auch verstanden. Das könnte funktionieren.
Mein Problem gerade ist, dass der eigentliche Linktext innerhalb dieses "Absatzes" (keine Ahnung wie sowas heißt) innerhalb einer Datei und über alle anderen Dateien jeweils unterschiedlich ist.
Bräuchte also einen Platzhalter dafür und da scheitere ich gerade.
 
Laut Hilfe kann er Regular Expessions. (=regex?)
Bin da aber vollkommen überfordert.
Kann Visual Studio Code bestimmte Zeilen Löschen?
Der Linkpart ist immer Zeile 19 - 30. Das wäre so ein no-brainer.
 
floq0r schrieb:
Notepad++ => CTRL+H => replace in files
<a.*?>[\s\S]*?<\/a>

Da hast du ja ein Beispiel für einen Regex. Regex definiert ein Muster: z.b. 3 Buchstaben und 4 Zahlen oder sowas.
Dann kann man nach diesem Muster suchen - ob der Windows Editor das kann -> ich bezweifle es lasse mich aber gerne überraschen.

Aber jede IDE wie eben z.b. Visual Studio Code kann das ohne Probleme.
 
Das von floq0r hatte ich wohl gesehen. Ich verstehe es nur nicht und weiß nicht wo/an welcher Stelle ich das einsetzten soll. Als Suchstring funktioniert das jedenfalls nicht, als Variable für den Link darin ebenfalls nicht.
Die Linklänge ist unterschiedlich, nur der Anfang (Domain) ist immer gleich.

Wie gesagt, notepad++ scheint das sehr wohl zu können, ich kann nur den Suchstring nicht selber gereieren.
Ist halt nicht meine Welt.
Ergänzung ()

In Visual Studio hätte ich das selbe Problem.
 
Es wurden jetzt viele Lösungsansätze vorgeschlagen, wo hängt es den noch?
 
  • Gefällt mir
Reaktionen: kim88
Hast du dort die Option unten RegularExpressions unten ausgewählt?

Kannst du mal die Einstellung vom S&E Fenster vom Notepad++ hier zeigen?

Ansonsten bitte kurz zwei, drei Auszüge aus der Datei hier posten. Persönliche Daten oder GPS Infos kannst du auch gerne mit sinngemässen Daten anonymisieren.
 
sh. schrieb:
Es wurden jetzt viele Lösungsansätze vorgeschlagen, wo hängt es den noch?
habe ich doch geschrieben, woran es hängt. Was soll ich noch tun?
Mein Problem gerade ist, dass der eigentliche Linktext innerhalb dieses "Absatzes" (keine Ahnung wie sowas heißt) innerhalb einer Datei und über alle anderen Dateien jeweils unterschiedlich ist.
Bräuchte also einen Platzhalter dafür und da scheitere ich gerade.
Laut Hilfe kann er Regular Expessions. (=regex?)
Bin da aber vollkommen überfordert.
ich kann nur den Suchstring nicht selber gereieren.
Ist halt nicht meine Welt.


@Nebuk Beispiel steht ja eigentlich im 1. Post.

Nochmal im "Stück" der "Linkblock" aus einer Datei. (Links aber in jeder Datei anders)
Es ändert sich also innerhalb einer Datei auch noch jeweils der Wert zwischen <type> <type>
....
<link href="https://www.gpsies.com/map.do?fileId=hculpgjeukyldiae">
<type>trackOnWeb</type>
</link>
<link href="https://www.gpsies.com/charts/hc/map/hculpgjeukyldiae_map.png">
<type>elevationChartUrlMap</type>
</link>
<link href="https://www.gpsies.com/charts/hc/mapThumb/hculpgjeukyldiae_mapThumb.png">
<type>elevationChartUrlMapThumb</type>
</link>
<link href="https://www.gpsies.com/charts/hc/tab/hculpgjeukyldiae_tab.png">
<type>elevationChartUrlTab</type>
</link>
...
 

Anhänge

  • Zwischenablage02.jpg
    Zwischenablage02.jpg
    57,1 KB · Aufrufe: 131
heidi-hoh schrieb:
Der Linkpart ist immer Zeile 19 - 30. Das wäre so ein no-brainer.
Dh du willst immer genau Zeile 19-30 aus einer xml löschen?
Wenn das wirklich ausnahmslos stimmt würde ich definitiv auch kein regex nutzen

Mit Notepad++ Makros geht es immerhin mit 1 Play-Mausklick pro Datei und ganz ohne Programmierkenntnisse. Da reicht einmal aufzeichnen und dann bei jeder weiteren abspielen.

Automatisch alle Dateien eines Ordners würd ich dann mit Python machen und eben genau diese Textzeilen NICHT in eine zweite „clone“ Datei übertragen
 
Ich habe testweise den gesamten Textblock so in "Replace" reinkopiert, das funktioniert dann halt genau (nur) bei einer Datei im Verzeichnis. Logisch. Funktionsweise der Programmoberfläche ist mir also verständlich.
Ergänzung ()

@kuddelmuddl
ist ausnahmslos Zeile 19-30.
Makros klöppeln oder Python ist weit weg von meinem Wissen. Keine Chance.
Wenn das einmal bereinigt wurde, habe ich hoffentlich bis an das Lebensende damit nichts mehr zu tun.
 
Perl:
perl -i.bak -ne 'print unless 19..30' heidi-ho21.xml
und das ganze in eine Schleife über die XML-Dateien, am besten in einer Shell (WSL)

die Dateien werden in-place verändert, -i.bak erzeugt ein backup-File.

Bash:
$>  for i in *.xml ; do perl -i.bak -ne 'print unless 19..30' "${i}" ; done

und wie "von Zauberhand" fehlen die besagten Zeilen in allen xml-Dateien.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Krik
@blöderidiot

puh, klingt gut. Überfordert mich aber komplett. Was mache ich damit? In Textfile kopieren, .bat nennen und im Verzeichnis ausführen???
Wie gesagt, 100% ahnungslos was diesen ganzen Kram betrifft.
File-Backup brauche ich nicht, mache ich vom Ordner vorher.

Ich gehe erst mal laufen.
 
Ich helfe gerne beim Anbau, ich helfe auch gerne bei der Jagd, aber vorkauen und dir in den Mund spucken werde ich es nicht. Alles was ich weiß hab ich auch über Suchmaschinen und bereits im Überfluss vorhandene Forenbeiträge gelernt.

Geh laufen und dann setz dich selbst mit dem Thema auseinander.
 
  • Gefällt mir
Reaktionen: sh.
heidi-hoh schrieb:
@blöderidiot

puh, klingt gut. Überfordert mich aber komplett. Was mache ich damit? In Textfile kopieren, .bat nennen und im Verzeichnis ausführen???
Gar nichts kopieren oder machen. Wenn Du im Windows die App "Ubuntu" installiert (am besten WSL version 1) hast:
1683569090250.png

kannst Du im Windows-Explorer mit Shift-Rechtsklick aufs Verzeichnis folgendes sehen:
1683569172867.png


"Open Linux shell here"

Dann kommst so ein Fenster wie dieses:
1683569261376.png

sieht so ähnlich aus wie das alte DOS-Fenster, ist aber Linux.

Dort kopierst Du einfach den Befehl rein und drückst Enter. Fertig (für dieses Verzeichnis).
for i in *.xml ; do perl -i.bak -ne 'print unless 19..30' "${i}" ; done
Das ist nämlich eine sog. "Linux-Bash", die Du in Deinem Verzeichnis geöffnet hast.

Das Problem für Dich wird sein, 1.) die WSL (Ver. 1) ordentlich zu installieren und 2.) Ubuntu aus dem Store (oder von Hand) zu installieren.
 
Zuletzt bearbeitet:
Zurück
Oben