Tags in mehreren XML-Dateien manipulieren
Tags in mehreren XML-Dateien manipulieren
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.
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.
Re: Tags in mehreren XML-Dateien manipulieren
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 xlstproc.
Ciao
Stefan
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 xlstproc.
Ciao
Stefan
Bürokratie kann man nur durch ihre Anwendung bekämpfen.
Re: Tags in mehreren XML-Dateien manipulieren
Hi,
zum Beispiel mit folgendem Stylesheet: (als genre.xslt abspeichern)
und dann xsltproc laufen lassen:
Ciao
Stefan
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>
Code: Alles auswählen
xsltproc genre.xslt filme.xml
Stefan
Bürokratie kann man nur durch ihre Anwendung bekämpfen.
Re: Tags in mehreren XML-Dateien manipulieren
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.
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.
Re: Tags in mehreren XML-Dateien manipulieren
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:01.09.2017 22:23:06Großer Gott! Mir war nicht bewusst, dass man Stylesheets für sowas verwenden kann. Ich dachte damit legt man nur Layout fest.
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:01.09.2017 22:23:06Mal aus Neugier: Wofür braucht man sowas? Was sind gängige use-cases?
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.:MoonKid hat geschrieben:01.09.2017 22:23:06In meinem Fall erscheint es mir einfacher die Tags mit einem Python Script zu bearbeiten, als so.
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!
Re: Tags in mehreren XML-Dateien manipulieren
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.Meillo hat geschrieben:02.09.2017 08:31:00Code: Alles auswählen
sed 's,<genre>Comedy</genre>,<genre>Komödie</genre>,; /<genre>Abenteuer<\/genre>/d' in >out
- 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.
Re: Tags in mehreren XML-Dateien manipulieren
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
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.
Re: Tags in mehreren XML-Dateien manipulieren
LOLMoonKid hat geschrieben:02.09.2017 09:39:01Ich 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.
Das ist wie zu sagen, dass Chinesisch eine Sprache fuer Maschinen waere (bloss weil sie kryptisch auf einen wirkt).
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:02.09.2017 09:39:01Wie soll ich in der Doku z.B. nach einem ; suchen, um herauszufinden, wofür es steht? Als Mensch fehlt mir hier der Zugang.
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,MoonKid hat geschrieben: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.
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!
Re: Tags in mehreren XML-Dateien manipulieren
Vielen Dank für die Erklärung! Das war schon sehr erhellend. Ich packs in meine Notizen.
Re: Tags in mehreren XML-Dateien manipulieren
Wenn ich in mehrere Dateien ( Text, XML, HTML .... ) was ändern will mache ich es mit bluefish > mit dem Such Werkzeug. Bluefish hat noch die Option " Alle finden... "
gany kann auch in Dateien suchen, wobei ich es noch nicht mit dem Ersetzen angewendet habe.
gany kann auch in Dateien suchen, wobei ich es noch nicht mit dem Ersetzen angewendet habe.
Systemd und PulseAudio, hmmm, nein danke.
Re: Tags in mehreren XML-Dateien manipulieren
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.
Ich suchen den String "<genre>Abenteuer</genre>" und möchte dann aber die gesamte Zeile löschen.
Re: Tags in mehreren XML-Dateien manipulieren
Zuerst eine XML Datei öffnen > Zeile / Zeilen zum löschen vorerst kopieren > Datei schliessenMoonKid hat geschrieben:03.09.2017 10:21:58Bluefish 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.
...
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 ).
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.