Tags in mehreren XML-Dateien manipulieren

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Tags in mehreren XML-Dateien manipulieren

Beitrag von MoonKid » 31.08.2017 23:10:08

Ich möchte in mehreren XML-Dateien (genauer NFO) <genre>-tags hinzufügen, entfernen oder ersetzen.

Beispielsweise möchte ich in einem Ordner incl. Unterordner in alle NFO-Dateien <genre>Comedy</genre> durch <genre>Komödie</genre> ersetzen.
Anderes Beispiel: <genre>Abenteuer</genre> entfernen

Bin am Überlegen, mir dafür ein Python-Script zu basteln, aber wollte vorher mal fragen, ob es da nicht doch schon was gibt.

Benutzeravatar
shoening
Beiträge: 897
Registriert: 28.01.2005 21:05:59
Lizenz eigener Beiträge: MIT Lizenz

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von shoening » 01.09.2017 07:25:45

Hi,

wenn es bei den beschriebenen Anpassungen bleibt, geht das vielleicht schon mit sed.

Im Zweifel würde ich bei XML Manipulationen aber immer auf XSLT setzen, z.B. mittels Debianxlstproc.

Ciao
Stefan
Bürokratie kann man nur durch ihre Anwendung bekämpfen.

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von MoonKid » 01.09.2017 09:44:57

shoening hat geschrieben: ↑ zum Beitrag ↑
01.09.2017 07:25:45
Debianxlstproc
Debianxsltproc

Ich sehe im manual nicht, wie mir das bei meinen Aufgaben helfen sollte.

Benutzeravatar
shoening
Beiträge: 897
Registriert: 28.01.2005 21:05:59
Lizenz eigener Beiträge: MIT Lizenz

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von shoening » 01.09.2017 11:11:33

Hi,

zum Beispiel mit folgendem Stylesheet: (als genre.xslt abspeichern)

Code: Alles auswählen

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" encoding="utf-8" indent="yes"/>

    <!-- Identity template : copy all text nodes, elements and attributes -->   
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="genre">
        <xsl:choose>
            <xsl:when test="./child::text() = 'Abenteuer'" />
            <xsl:when test="./child::text() = 'Comedy'">
                <genre>Komödie</genre>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy>
                    <xsl:apply-templates select="@*|node()" />
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>
und dann xsltproc laufen lassen:

Code: Alles auswählen

xsltproc genre.xslt filme.xml
Ciao
Stefan
Bürokratie kann man nur durch ihre Anwendung bekämpfen.

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von MoonKid » 01.09.2017 22:23:06

Großer Gott! ;) Mir war nicht bewusst, dass man Stylesheets für sowas verwenden kann. Ich dachte damit legt man nur Layout fest.
Mal aus Neugier: Wofür braucht man sowas? Was sind gängige use-cases?

In meinem Fall erscheint es mir einfacher die Tags mit einem Python Script zu bearbeiten, als so.

Benutzeravatar
sbruder
Beiträge: 333
Registriert: 24.06.2016 13:54:36
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Franken

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von sbruder » 01.09.2017 23:35:08

MoonKid hat geschrieben: ↑ zum Beitrag ↑
01.09.2017 22:23:06
Mal aus Neugier: Wofür braucht man sowas? Was sind gängige use-cases?
Automatische Erzeugung von XML-Dateien in z.B. Webapplikationen. Debianicecast2 benutzt es zur Generierung der XSPF-Playlisten und der XHTML-Status– bzw. Admin-Seite.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von Meillo » 02.09.2017 08:31:00

MoonKid hat geschrieben: ↑ zum Beitrag ↑
01.09.2017 22:23:06
Großer Gott! ;) Mir war nicht bewusst, dass man Stylesheets für sowas verwenden kann. Ich dachte damit legt man nur Layout fest.
Du darfst CSS und XSL nicht verwechseln. Beides nennt man Style-Sheets. Beides legt ein Layout fest, wobei das im Falle von XSL nicht unbedingt ein grafisches Layout fuer die Oberflaeche sein muss.
MoonKid hat geschrieben: ↑ zum Beitrag ↑
01.09.2017 22:23:06
Mal aus Neugier: Wofür braucht man sowas? Was sind gängige use-cases?
Fuer XSL findest du sicher etwas auf dessen Wikipediaseite. Damit transformiert man halt XML in anderes XML oder in etwas ganz anderes. Man kann damit z.B. ein beliebiges XML in HTML verwandeln, um es im Browser anzeigen zu lassen. Noch mehr: Der Browser kann diese Umwandlung on-the-fly selbst erledigen.
MoonKid hat geschrieben: ↑ zum Beitrag ↑
01.09.2017 22:23:06
In meinem Fall erscheint es mir einfacher die Tags mit einem Python Script zu bearbeiten, als so.
Sehe ich auch so, in Python, wenn dir das gelaeufig ist, oder eben mit sed(1), weil der Fall hier so einfach ist. Z.B.:

Code: Alles auswählen

sed 's,<genre>Comedy</genre>,<genre>Komödie</genre>,; /<genre>Abenteuer<\/genre>/d' in >out
Use ed once in a while!

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von MoonKid » 02.09.2017 09:39:01

Meillo hat geschrieben: ↑ zum Beitrag ↑
02.09.2017 08:31:00

Code: Alles auswählen

sed 's,<genre>Comedy</genre>,<genre>Komödie</genre>,; /<genre>Abenteuer<\/genre>/d' in >out
Ich vermute die manpage ist hier keine gute Anlaufstelle? Kan deinen Aufruf hier nicht wirklich rekonstruieren/verstehen, obwohl er tatsächlich funktioniert. Auch info ist wenig hilfreich. sed ist eine Sprache für Maschienen. Wie soll ich in der Doku z.B. nach einem ; suchen, um herauszufinden, wofür es steht? Als Mensch fehlt mir hier der Zugang. ;)
  • Da sind 3 Kommas in deinem String. Zweck unbekannt.
  • Das Konstrukt s/regexp/replacement/ vermisse ich bei dir.
  • Bei Abenteuer scheint im schließenden genre-tag das / maskiert worden zu sein. Bei den tags vorher aber nicht.
  • Das / nach dem Semikolon kann ich mir auch nicht erklären.

Benutzeravatar
shoening
Beiträge: 897
Registriert: 28.01.2005 21:05:59
Lizenz eigener Beiträge: MIT Lizenz

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von shoening » 02.09.2017 09:58:14

Hi,

meine erste Anlaufstelle für Dokumentationen zu allem was mit XML zu tun hat sind immer die Seiten beim W3C - in diesem Fall zu XSLT und XPATH:

https://www.w3.org/TR/xslt
https://www.w3.org/TR/xpath/

Und zu dem sed: Die Kommas nimmt Meillo anstelle eines Slash als Trennzeichen, damit man die Slashes in den schließenden Tags nicht maskieren muss.

Ciao
Stefan
Bürokratie kann man nur durch ihre Anwendung bekämpfen.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von Meillo » 02.09.2017 10:37:58

MoonKid hat geschrieben: ↑ zum Beitrag ↑
02.09.2017 09:39:01
Ich vermute die manpage ist hier keine gute Anlaufstelle? Kan deinen Aufruf hier nicht wirklich rekonstruieren/verstehen, obwohl er tatsächlich funktioniert. [...] sed ist eine Sprache für Maschienen.
LOL :-D

Das ist wie zu sagen, dass Chinesisch eine Sprache fuer Maschinen waere (bloss weil sie kryptisch auf einen wirkt).
MoonKid hat geschrieben: ↑ zum Beitrag ↑
02.09.2017 09:39:01
Wie soll ich in der Doku z.B. nach einem ; suchen, um herauszufinden, wofür es steht? Als Mensch fehlt mir hier der Zugang. ;)
Nun, sed(1) ist eine Sprache, nicht bloss ein Tool. Die Manpage ist dabei eine Erinnerunghilfe und ein Nachschlagewerk aber keine vollstaendige Sprachbeschreibung und noch weniger eine Einfuehrung in die Sprache.

MoonKid hat geschrieben: ↑ zum Beitrag ↑
02.09.2017 09:39:01
  • Da sind 3 Kommas in deinem String. Zweck unbekannt.
  • Das Konstrukt s/regexp/replacement/ vermisse ich bei dir.
  • Bei Abenteuer scheint im schließenden genre-tag das / maskiert worden zu sein. Bei den tags vorher aber nicht.
  • Das / nach dem Semikolon kann ich mir auch nicht erklären.
Man kann die Slashes im s-Kommando durch ein beliebiges Zeichen ersetzen, damit man sie im Ersatztext nicht escapen muss, das habe ich mit den Kommas gemacht (auch weil ich die ohne Shift tippen kann). Bei mir ist es also s,regexp,replacement,

Haette ich beim s-Kommando Slashes verwendet, dann haette ich den Slash bei ``</genre>'' auch escapen muessen.

Das Semikolon ist der Kommandotrenner. Damit kann man mehrere Kommandos in einer Zeile hintereinander reihen. Der Slash danach ist eine Suche. Du findest das in der Manpage unter Adressen. Das ist die Adresse fuer das d-Kommando, das diese Zeile dann loescht. (Btw: Besser waere wohl ``g/regexp/d'', weil dann alle Vorkommen in der Datei geloescht werden und nicht nur das naechste.)


Leider habe ich im Moment nicht genug Zeit um in Ruhe zu schreiben. Ich hoffe aber, dass diese Infos schonmal weiterhelfen. Und natuerlich wuerde ich mich freuen, wenn du sed lernen willst. Dazu kann ich dir gerne spaeter auch noch mehr Hilfestellung geben und mehr erklaeren.
Use ed once in a while!

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von MoonKid » 02.09.2017 12:05:51

Vielen Dank für die Erklärung! Das war schon sehr erhellend. Ich packs in meine Notizen.

Benutzeravatar
Revod
Beiträge: 3788
Registriert: 20.06.2011 15:04:29
Lizenz eigener Beiträge: MIT Lizenz

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von Revod » 02.09.2017 12:34:04

Wenn ich in mehrere Dateien ( Text, XML, HTML .... ) was ändern will mache ich es mit Debianbluefish > mit dem Such Werkzeug. Bluefish hat noch die Option " Alle finden... "

Debiangany kann auch in Dateien suchen, wobei ich es noch nicht mit dem Ersetzen angewendet habe.
Systemd und PulseAudio, hmmm, nein danke.

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von MoonKid » 03.09.2017 10:15:32

Revod hat geschrieben: ↑ zum Beitrag ↑
02.09.2017 12:34:04
Debiangany kann auch in Dateien suchen, wobei ich es noch nicht mit dem Ersetzen angewendet habe.
Bist du sicher, dass das so heißt?

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von MoonKid » 03.09.2017 10:21:58

Bluefish sieht interessant aus. Wie geht man da mit Escape-Zeichen um?
Ich suchen den String "<genre>Abenteuer</genre>" und möchte dann aber die gesamte Zeile löschen.
MoonKid hat geschrieben: ↑ zum Beitrag ↑
03.09.2017 10:15:32
Revod hat geschrieben: ↑ zum Beitrag ↑
02.09.2017 12:34:04
Debiangany kann auch in Dateien suchen, wobei ich es noch nicht mit dem Ersetzen angewendet habe.
Bist du sicher, dass das so heißt?

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von Meillo » 03.09.2017 10:29:26

MoonKid hat geschrieben: ↑ zum Beitrag ↑
03.09.2017 10:15:32
Revod hat geschrieben: ↑ zum Beitrag ↑
02.09.2017 12:34:04
Debiangany kann auch in Dateien suchen, wobei ich es noch nicht mit dem Ersetzen angewendet habe.
Bist du sicher, dass das so heißt?
Er meint sicher Debiangeany.
Use ed once in a while!

Benutzeravatar
Revod
Beiträge: 3788
Registriert: 20.06.2011 15:04:29
Lizenz eigener Beiträge: MIT Lizenz

Re: Tags in mehreren XML-Dateien manipulieren

Beitrag von Revod » 03.09.2017 22:56:20

MoonKid hat geschrieben: ↑ zum Beitrag ↑
03.09.2017 10:21:58
Bluefish sieht interessant aus. Wie geht man da mit Escape-Zeichen um?
Ich suchen den String "<genre>Abenteuer</genre>" und möchte dann aber die gesamte Zeile löschen.
...
Zuerst eine XML Datei öffnen > Zeile / Zeilen zum löschen vorerst kopieren > Datei schliessen

Suchwerkzeuge > Suchen & Ersetzen In Dateien suchen > Alle finden | Im Suchwerkzeug die kopierte Zeile einfügen > in der untere zweite Zeile einen Leerschlag und das Leerschlag wieder entfernen und dann auf > Alle ersetzen klicken.

Auch mehrere Zeilenblöcke sind durch " Copy & Paste " so ersetzbar. Was ein " Escape " Zeichen ist weiss ich nicht. Doch Bluefish ist wegen seine verschiedene ascii Formatierung, ich glaube auf alle Zeichen ausgerichtet, die er erkennen kann. Ist " unglaublich " mächtig ( Kann nicht nur HTML ). :wink:

Habe mir jetzt auch " Notepadqq " angesehen, der hat noch 2 - 3 Optionen mehr in Suchen und Ersetzen. Version v1.0.1 ist auch sehr mächtig, ausser einfach nur zusammengehörende " Paare " der Syntax kann es nicht. Entweder markiert es alle, z. B. " <div ... </div> " oder keines

Ja, danke Meillo, " Geany " ist richtig.
Systemd und PulseAudio, hmmm, nein danke.

Antworten