Werte aus XML auslesen?

n0varino

Cadet 3rd Year
Registriert
Sep. 2015
Beiträge
45
Hallo zusammen,

ich stehe vor einem Problem, bei dem ich nicht wirklich einen Ansatz habe.

Ich habe einen Ordner voller Unterordner mit generierten Ordnernamen, die Ordnernamen bestehen aus einem C und einem Zeitstempel, die habe ich bereits in eine CSV geschrieben.

In jedem Unterordner ist eine Datei, mit ebenfalls generiertem Dateinamen, ohne Dateiendung.
In jedem Unterordner ist auch eine XML-Datei, in der der ursprüngliche Dateiname, und die Endung steht. Die XML heißt immer gleich.

Wie bekomme ich es nun hin, der Datei wieder ihre Dateiendung aus der XML anzuhängen?

Die XML ist wie folgt aufgebaut:

Code:
<?xml version="1.0" encoding="UTF-8"?>

-<CatalogMetadata relative_path="/01/ARTIKEL/C2009040207381750118">

<CatalogEntry filename_original="0000.5443.142.pdf" filename="B2009040207384410019"/>

</CatalogMetadata>

C2009040207381750118 ist der Ordner mit generiertem Namen
0000.5443.142.pdf ist der ursprüngliche Dateiname
B2009040207384410019 ist der generierte neue Dateiname

Am liebsten wäre es mir, die Dateien umzubenennen in B2009040207384410019_0000.5443.142.pdf (also alter + neuer Dateiname.ENDUNG), und ich benötige eine CSV mit Verknüpfung Ordnername + kombiniertem Dateinamen.

Kann mir jemand weiterhelfen?

Vielen Dank.

lg
 
Vielleicht so:
How to change or rename a file, folder, or directory
per cmd
(Beispiel) rename * *.pdf
vorher in den richtigen Subfolder navigieren.

hab es getestet -> funktioniert (also wenn nur die Dateiendung angepasst werden soll...)

Falls du jedoch die Dateinamen selber aus dem XML definieren willst, kannst du versuchen dir diese mittels XPATH aus dem XML-File zu extrahieren, noch bevor die Datei generiert wird (falls das möglich ist...).
 
Zuletzt bearbeitet:
Versteh ich das richtig, dass der Output den du weiterverarbeiten sollst nicht von dir ist und du keine Programmiersprache kannst?
 
Die Ordnernamen stehen in einer Datenbank, ich habe die Daten via SQL abgefragt und in die CSV geschrieben.

Dementsprechend gibt es auch noch keinen Code, da ich überhaupt keinen Ansatz aktuell habe.
Ergänzung ()

Nexialist. schrieb:
Vielleicht so:
How to change or rename a file, folder, or directory
per cmd
vorher in den richtigen Subfolder navigieren.

hab es getestet -> funktioniert (also wenn nur die Dateiendung angepasst werden soll...)

Falls du jedoch die Dateinamen selber aus dem XML definieren willst, kannst du versuchen dir diese mittels XPATH aus dem XML-File zu extrahieren, noch bevor die Datei generiert wird (falls das möglich ist...).

Es geht ja nicht um das Umbenennen, das ist kein Problem. Es geht um das Exportieren der Daten aus den XML-Files.

Danke für den Tipp mit XPATH, werde mich mal einlesen.
Ergänzung ()

MrTree schrieb:
Versteh ich das richtig, dass der Output den du weiterverarbeiten sollst nicht von dir ist und du keine Programmiersprache kannst?

Verstehe a) nicht, was der Beitrag soll und b) SOLL ich überhaupt nichts. Unnötiger Beitrag.
 
Nexialist. schrieb:
Vielleicht so:
How to change or rename a file, folder, or directory
per cmd
vorher in den richtigen Subfolder navigieren.

hab es getestet -> funktioniert (also wenn nur die Dateiendung angepasst werden soll...)

Falls du jedoch die Dateinamen selber aus dem XML definieren willst, kannst du versuchen dir diese mittels XPATH aus dem XML-File zu extrahieren, noch bevor die Datei generiert wird (falls das möglich ist...).

Powershell kann heutzutage viel mehr als die alte CMD.

Du kannst theoretisch alles mit der Powershell machen (Rekursiv Ordner/Dateien lesen, XML parsen, Umbenennen):
https://blogs.technet.microsoft.com...shell-to-parse-an-xml-file-and-sort-the-data/
ist schonmal XML Parsen.

Dazu noch den Rename-Befehl und rekursives auslesen der Ordner und nach den .XML-Dateien suchen, dann sollte das alles realisierbar sein, ohne Programm.

Die Powershell kann mittlerweile sehr viel. Findet aber noch recht wenig Beachtung.

Alternativ Java mit XPATH/SAX. Oder eben eine andere Programmiersprache.

Edit: Falls das ganze unter Linux laufen soll (ich vermute nicht, dann geht das auch dort mit Shellscript).
 
Heul doch nicht gleich so rum, was ist unnütz daran wenn ich wissen will, ob du ne Programmiersprache kannst in der man dich mit Beispielen unterstützen kann.

Aus welchen Grund sollte man was aus einer Datenbank auslesen und in CSV schreiben um es dann aus dem CSV auszulesen und damit weiter zu arbeiten? Da sich mir diese Frage stellt, wollte ich wissen ob du das im Auftrag von jemandem machst oder ob der Ansatz vielleicht schon ein anderer sein sollte, nämlich das ganze direkt aus der DB zu lesen und die Dateien zu verarbeiten.
 
Ich hab XML-Daten auch schon mittels RStudio ausgelesen (Files aus Ordnern gelesen, analysiert, neue Files mit entsprechenden selbstgenerierten Dateinamen erstellt), alles mit XPATH -> also, dass wäre auch eine Möglichkeit.
 
Ich habe mir jetzt erstmal dahingehend beholfen, den Inhalt aller XML Dateien untereinander weg in eine Datei zu schreiben
( for /f "delims=" %%i in ('dir C:\temp\CatalogMetadata.xml /b /s') do @type "%%i" >> C:\temp\xml.txt ), dann habe ich die " (Apostrophe) als Trenner für den CSV Import in Excel genutzt, und die unnötigen Spalten weggelöscht, nun habe ich nur noch 3 Spalten mit Ursprungsname, generiertem Ordnernamen und generiertem Datenamen.

Sicher nicht der professionellste Weg, aber es funktioniert.
Den Rename mit Hilfe der neuen Datei muss ich mir mal noch anschauen, ich melde mich nochmal, falls es nicht klappt.

Danke aber erstmal.

lg
 
Mit C# kannst du ganz einfach die XML Datei auslesen entsprechend der Einträge umbenennen
Code:
	XmlDocument doc = new XmlDocument();
	doc.Load(xmlfile);
	string location = doc["CatalogMetadata"].Attributes["relative_path"].Value;
	if (location.StartsWith("/"))
		location = location.Substring(1);
	location = location.Replace("/", "\\");
	var path = Path.Combine(folder, location);
	string filename = doc["CatalogMetadata"]["CatalogEntry"].Attributes["filename"].Value;
	string filenameOrg = doc["CatalogMetadata"]["CatalogEntry"].Attributes["filename_original"].Value;
	File.Move(Path.Combine(path, filename), Path.Combine(path, filenameOrg));
 
n0varino schrieb:
Ich habe mir jetzt erstmal dahingehend beholfen, den Inhalt aller XML Dateien untereinander weg in eine Datei zu schreiben
( for /f "delims=" %%i in ('dir C:\temp\CatalogMetadata.xml /b /s') do @type "%%i" >> C:\temp\xml.txt ), dann habe ich die " (Apostrophe) als Trenner für den CSV Import in Excel genutzt, und die unnötigen Spalten weggelöscht, nun habe ich nur noch 3 Spalten mit Ursprungsname, generiertem Ordnernamen und generiertem Datenamen.

Sicher nicht der professionellste Weg, aber es funktioniert.
Den Rename mit Hilfe der neuen Datei muss ich mir mal noch anschauen, ich melde mich nochmal, falls es nicht klappt.

Danke aber erstmal.

lg

Es wäre gut, wenn du den Leuten die dir helfen möchten mitgibst, welchen Hintergrund du hast. Programmiererfahrung ja/nein, Wenn ja, welche...

Wenn du nicht zwingend eine konsolidierte Datei mit allen Dateinamen benötigst, dann solltest/brauchst du keine Dateien als Zwischenergebnis erzeugen. Die einfachste Lösung sollte die beste sein.

Wenn ich dich richtig verstehe gibt es einen Wurzelordner, darunter liegen Ordner und darin XML-Dateien, die für Dateien ohne Endung ihren ursprünglichen Dateinamen angeben.

  1. Ergo rekursiv die Ordner durcharbeiten,
  2. Findet sich in einem Ordner eine XML-Datei, dann parse sie und benennte alle Dateien nach deinem Wunschmuster um.
  3. Solltest du in diesem Zuge dennoch eine CSV-Datei erstellen wollen, dann kannst du das bei jedem umbenennen schreiben.

Rekursives Ordner/Dateien lesen, XPath und Dateien schreiben können alle modernen Shells (Powershell, Linux shell). Programmiersprachen sowieso. Aber von CMD würde ich in diesem Fall abstand nehmen. Ist veraltet und Powershell die bessere und neuere Alternative. Sollte auch mittlerweile auf jedem Windows verfübar sein. Außer du nutzt noch XP. Sollte das der Fall sein, wäre es Zeit für ein Update ;)

MrTree hat dir schon ein Snippet für XML-Parsen in C# gegeben. Darum kannst du dir noch einen Code bauen, der die Ordner rekursiv liest und XML-Dateien parsed. Fertig.
 
h3rbert schrieb:
...
MrTree hat dir schon ein Snippet für XML-Parsen in C# gegeben. Darum kannst du dir noch einen Code bauen, der die Ordner rekursiv liest und XML-Dateien parsed. Fertig.

Im Prinzip kannst du in C# die Ordner ganz simple mit foreach und genauso auch alle Xml-Dateien durchgehen
Code:
foreach(var folder in Directory.GetDirectories(dir))
{
	foreach(var xmlfile in Directory.GetFiles(folder, "*.csv"))
	{
 
Zurück
Oben