dudofski
Goto Top

Mit einer .bat eine XML Datei auslesen und umbenennen

Hallo liebe 'Administratoren'!
Ich brauche hilfe, da ich mich mit diesen Batch Dateien nicht gut auskenne. Ich bin für jede Hilfe extrem dankbar.

Ich hoffe, jemand kann mir ein Beispiel zeigen, wie man einfach ein XML mit einer Batch Datei umbenennen kann.

Die XML Datei hat das Format 123456.xml und liegt in einem Archivverzeichnis mit weiteren Dateien. Es handelt sich um ein Backup von einer Datenbank - alle Textdaten zum entsprechenden Titel sind im jeweiligen XML zu finden.

Da diese Nummer alleine nicht aussagekräftig ist, möchte ich den entsprechenden Tag im XML auslesen und an die Nummer hängen, also: 123456_buchtitel.xml

Und das ist schon alles.

Der Titel ist im Feld <title> gespeichert.
Als Erweiterung müsste allenfalls ein weiteres Feld an den Filenamen gehängt werden, also sowas wie:
123456_buchtitel_version.xml
Die Version ist auch hier im Feld <version> vorhanden.

Vielen Dank schon im Voraus für Eure Hilfe und Unterstützung.

dude

Content-Key: 196641

Url: https://administrator.de/contentid/196641

Printed on: May 7, 2024 at 01:05 o'clock

Member: bastla
bastla Jan 08, 2013 at 21:55:07 (UTC)
Goto Top
Hallo dudofski und willkommen im Forum!

Da Du kein Beispiel (zumindest der relevanten Zeilen) einer XML-Datei gepostet hast (falls Du das nachholen möchtest, verwende bitte "Code"-Formatierung dafür), nehme ich als unverbesserlicher Optimist an, dass jedes Feld in einer eigenen Zeile steht - dann könnte das etwa so gehen:
@echo off & setlocal
set "Ordner=D:\XML-Archiv"  

pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b/a-d *.xml') do call :ProcessFile "%%i"  
popd
pause
goto :eof

:ProcessFile
for /f "tokens=2 delims=<>" %%t in ('findstr "<title>" %1') do set "Titel=%%t"  
for /f "tokens=2 delims=<>" %%v in ('findstr "<version>" %1') do set "Version=%%v"  
echo ren %1 "%~n1_%Titel%_%Version%%~x1"  
goto :eof
Wegen des "echo" in Zeile 13 wird (zum Testen) das Umbenennen der Dateien nur durch Ausgabe des jeweiligen Befehles simuliert. Falls die Tags "<title>" und "<version>" nicht am Zeilenanfang stehen sondern eingerückt sind, wäre in den Zeilen 11 und 12 jeweils "tokens=3" zu verwenden.

Grüße
bastla
Member: dudofski
dudofski Jan 09, 2013 at 22:34:57 (UTC)
Goto Top
Hallo Bastla,

poah - das ging ja fix. Vielen Dank, das ist ja grossartig. Ich werde das morgen früh gleich mal testen.

Ich habe Dir hier noch den Beginn einer entsprechenden XML Datei herauskopiert, damit Du siehst, wie sie aufgebaut ist - für alle Fälle face-smile

<?xml version="1.0" encoding="utf-8"?>  
<video>
  <directory group="system">12909</directory>  
  <guid group="system">BDC174FA-2F73-4C99-BDBB-FD76B8137238</guid>  
  <original_file group="system">LE_CAPITAL.mp4</original_file>  
  <metadata group="core" name="product_content">  
    <title>Le Capital TRAILER (F)</title>
    <title_original>Le Capital</title_original>
    <episode></episode>
    <episode_title></episode_title>
    <episode_number></episode_number>
    <season_number></season_number>
    <countries_of_origin>
      <country>FRA</country>
    </countries_of_origin>

usw. Die XML Datei ist nahezu endlos... Ich hoffe, das genügt. Falls Du noch mehr Details zum Verifizieren brauchst, dann lass es mich wissen.
Konkret geht es um die Felder TITLE und EPISODE_NUMBER - Das Ausgabeformat in diesem Fall soll sein: 12909_Le Capital TRAILER (F).xml

Besten Dank und
liebe Grüsse
dude
Member: bastla
bastla Jan 09, 2013 updated at 22:57:51 (UTC)
Goto Top
Hallo dudofski!

Auf Basis Deines Musters sollte die folgende Version des Unterprogramms ":ProcessFile" besser passen:
:ProcessFile
set "Titel=" & set "Episode="  
for /f "tokens=3 delims=<>" %%t in ('findstr /i "<title>" %1^|findstr /iv "<title></title>"') do set "Titel=%%t"  
for /f "tokens=3 delims=<>" %%e in ('findstr /i "<episode_number>" %1^|findstr /iv "<episode_number></episode_number>"') do set "Episode=%%e"  
set "NameNeu=%~n1"  
if defined Titel set "NameNeu=%NameNeu%_%Titel%"  
if defined Episode set "NameNeu=%NameNeu%_%Episode%"  
echo ren %1 "%NameNeu%%~x1"  
goto :eof
Es wird jetzt vorausgesetzt, dass die Tags "<title>" bzw "<episode_number>" nicht am Zeilenanfang stehen, aber das erste/einzige Feld der jeweiligen Zeile kennzeichnen. Sollte eine der Informationen (vermutlich eher die "episode_number", wie auch im Beispiel) fehlen, wird sie (und das Trennzeichen "_") nicht in den neuen Namen einbezogen.

Wenn das Testergebnis vernünftig aussieht, einfach nur das "echo" vor dem "ren" entfernen und so den Batch "scharf" schalten ...

Grüße
bastla

P.S.: Ging's nicht eigentlich um Bücher?