derori
Goto Top

XML Datei mit Gif-Bild in Base64 Kodierung, decodieren und als Gif speichern, Name der Datei sollte ein inhalt aus der XML sein

Einen sonnigen Nachmittag Zusammen,

es ist schon ziemlich Warm heute und mein Hirn brutzelt mit dahin.

Was programmieren und Scripten angeht, bin ich noch ziemlich am Anfang, lese mich aber gerne ein und versuche mich gern an neuen Herausforderungen.

Aber nun Erstmal zu meinem Problem:

Ich hab eine menge Verschlagworteter gescannter Belege, diese liegen mir als XML Dateien Vor, die alle in eine DMS (läuft auf einem Win2012 R2) hinein sollen.

--

Zu erst dachte ich, es wäre am einfachsten alle werte der XML per VBS in die SQL2014 Datenbank direkt zu speichern und dann schauen ob der DMS Viewer den Base64 Kode decodieren und Grafisch darstellen kann. Aber dieser Gedanke wird vom Hersteller nicht supportet, da ich nur Daten mit den Bordmitteln in die DMS laden darf soll. Also müll.

Nun bin ich offen für Vorschläge für Folgende Überlegung.

Die XML nehmen, den Base64 Kode decocen als gif Datei speichern in einen bestimmten Pfad mit dem Wert zwischen <SdgNr></SdgNr> als Datei Namen.
Und das ganze am besten automatisch sobald eine oder mehre XML Dateien im Ordner auftauchen.

Ich weiß Ihr schwitzt alle genauso, außer wenn ihr ein wunderschön klimatisiertes Büro euer eigen nennen dürft ^^
Aber vllt. hat einer eine Idee oder bringt mich auf den richtigen Pfad der Erleuchtung.


So sieht der Inhalt der XML aus:


<?xml version="1.0" encoding="ISO-8859-1" ?>
- <Dokument>
  <DateTime>01.12.2014 07:14:11</DateTime>
  <PosNr></PosNr>
  <LongNr></LongNr>
  <Typ>0</Typ>
  <SdgNr>0007777777</SdgNr>
  <Est>00000</Est>
  <Ast>00000</Ast>
  <Freidatum>31.12.1899 00:00:00</Freidatum>
  <Referenz />
  <Absname>Donald Duck</Absname>
  <Absstr>Entenweg 3</Absstr>
  <Absplz>6666</Absplz>
  <Absland>DE</Absland>
  <Absort>Entenhausen</Absort>
  <Empname>Max Mustermann</Empname>
  <Empstr>Musterstraße 1</Empstr>
  <Empplz>9999</Empplz>
  <Empland>DE</Empland>
  <Emport>Musterstadt</Emport>
  <Kdnnr />
  <Kdnname />
  <Kdnstr />
  <Kdnplz />
  <Kdnland />
  <Kdnort />
  <Gewicht>69</Gewicht>
  <Anzahl>2</Anzahl>
  <VPArt />
  <NVE></NVE>
  <Zustellstati>False</Zustellstati>
  <Unterzeichner />
  <Zugestelltzeit>01.12.2014 07:14:10</Zugestelltzeit>
  <Datei> Hier steht der Base64 Code </Datei>
  <DateiTyp>.gif</DateiTyp>
  </Dokument>

Ich sag schon mal Danke für jeden input

Grüße Matze

Content-Key: 308025

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

Printed on: April 16, 2024 at 13:04 o'clock

Member: colinardo
colinardo Jun 23, 2016 updated at 15:40:54 (UTC)
Goto Top
Hallo Matze,
das ist schnell gemacht. Hier ein funktionsfähiges Beispiel mit Powershell das einen Ordner auf neue XML-Dateien überwacht, daraus die Infos extrahiert den Base64 kodierten String dekodiert und als Datei mit dem Namen aus dem Attribut SgdNr. und der Dateierweiterung aus dem Attribut DateiTyp in einem frei wählbaren Ordner erstellt.

Anzupassen sind im Kopf der Ordner der überwacht werden soll und der Zielordner für die Bilder. Dann startest du das Skript und erst dann wirfst so eine XML-Datei in den Ordner. Das Bild wird dekodiert und im Bilderpfad gespeichert.
# Ordner in dem die XML-Dateien erwartet werden
$folderSource = 'C:\Daten\XML'  
# Ordner in den die Bilder kopiert werden
$folderDestination = 'D:\Bilder\gifs'  
# Überwachungsfilter
$filter = '*.xml'  

#Eventuell laufenden Subscriber beenden
Get-EventSubscriber -SourceIdentifier XMLCreated -EA SilentlyContinue | Unregister-Event -Force

$fsw = New-Object IO.FileSystemWatcher $folderSource, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}   
Register-ObjectEvent $fsw Created -SourceIdentifier XMLCreated -Action { 
    $fullpath = $Event.SourceEventArgs.FullPath
    $timeStamp = $Event.TimeGenerated
    Write-Host "Neue XML-Datei: '$fullpath' wurde um '$timeStamp' erstellt." -F green  
    try{
        # XML-Datei als Objekt einlesen
        $xml = New-Object XML ; $xml.Load($fullpath)
        # neuer Pfad für die Bilddatei aus den Attributen in der XML-Datei zusammensetzen
        $imagepath = "$folderDestination\$($xml.Dokument.SdgNr)$($xml.Dokument.Dateityp)"  
        write-host "Extrahiere Bild aus der XML-Datei nach: '$imagepath'" -F Green  
        # Base64 dekodieren und in Datei schreiben
        [System.IO.File]::WriteAllBytes($imagepath,[System.Convert]::FromBase64String($xml.Dokument.Datei))
    }catch{
        write-host "Error: $($_.Exception.Message)" -F Red  
    }
}

cls
write-host "Warte auf neue XML-Dateien im Ordner: '$folderSource' ..."  
while($true){
    sleep 1
}
Das ganze lässt sich natürlich auch mit jeder anderen halbwegs vernünftigen Programmiersprache umsetzen.
Aber es zeigt mal wieder wie flexibel und vielseitig Powershell dank dem .NET-Framework nutzbar ist.

Hoffe das wirkt jetzt trotz der Hitze ein bisschen wie kühles Eis auf deiner Stirn face-big-smile

Grüße Uwe
Member: DerOri
DerOri Jun 23, 2016 updated at 15:43:09 (UTC)
Goto Top
Hey Uwe,

Ich werde das mal testen und Feedback geben.

Sag aber schon mal danke für die schnelle Antwort. Und die kühle Erfrischung.;)

Und ein besonderes Danke für die einzelnen Erklärungen, muss mir mal PowerShell genauer ansehen.

Mit freundlichen Grüßen

Matze
Member: DerOri
DerOri Jun 24, 2016 at 06:03:23 (UTC)
Goto Top
Also Nochmal ein riesen Danke, funktioniert genauso wie ich es mir gedacht hatte

Grüße

Matze
Member: colinardo
colinardo Jun 24, 2016 updated at 06:32:20 (UTC)
Goto Top
Freut mich face-smile

Schönen Start ins Wochenende
Grüße Uwe