Powershellscript zum konvertieren und anpassen einer XML für Elster Import
Guten Morgen Zusammen,
Ich habe nun mehrere Tage damit verschwendet ein vielleicht recht simples Script zu schreiben was nicht funktioniert hat.
Vielleicht hat jemand das gleiche Problem oder jemand die Lösung.
IST-Zustand:
Wir haben hier "Navision 2009 R2" als ERP. Unsere Buchhaltung benutzt zudem "Elster Online".
Aus dem Navision wird eine XML exportiert welche folgenden aufbau hat:
Laenderkennzeichen ~ knre1 2 Großbuchstaben
USt-IdNr. ~ knre2 Buchstaben und Zahlen
Betrag (EUR) ~ betrag Kann positiv und negativ sein. Nur ganze Zahlen
Art der Leistung ~ dreieck "false" und "true"
SOLL-Zustand:
Erst die "datarow"s in "dataset" werden wichtig, die sollen dann in in eine CSV welche Kommagetrennt ist.
Die erste Zeile der CSV sollte "Laenderkennzeichen,USt-IdNr.,Betrag(EUR), Art der Leistung" enthalten.
Laenderkennzeichen ~ knre1 2 Großbuchstaben
USt-IdNr. ~ knre2
Betrag (EUR) ~ betrag Kann positiv und negativ sein. Nur ganze Zahlen
Art der Leistung ~ dreieck
Zudem soll die statt "false" in dreieck ein "L" stehen oder wenn "true" ein "D".
Ich habe nun mehrere Tage damit verschwendet ein vielleicht recht simples Script zu schreiben was nicht funktioniert hat.
Vielleicht hat jemand das gleiche Problem oder jemand die Lösung.
IST-Zustand:
Wir haben hier "Navision 2009 R2" als ERP. Unsere Buchhaltung benutzt zudem "Elster Online".
Aus dem Navision wird eine XML exportiert welche folgenden aufbau hat:
Laenderkennzeichen ~ knre1 2 Großbuchstaben
USt-IdNr. ~ knre2 Buchstaben und Zahlen
Betrag (EUR) ~ betrag Kann positiv und negativ sein. Nur ganze Zahlen
Art der Leistung ~ dreieck "false" und "true"
<?xml version="1.0" encoding="UTF-8"?>
<xml-data xmlns="http://www.lucom.com/ffw/xml-data-1.0.xsd">
<form>catalog://Unternehmen/ust/ZM_Formular_online</form>
<instance>
<datarow>
<element id="ID_USER">.anonymous</element>
<element id="knri2">987654321</element>
<element id="jahr">2016</element>
<element id="berichtigung">false</element>
<element id="Uname">Meine Firma GmbH</element>
<element id="Ustrasse">Rudolf-Diesel-Str. 89</element>
<element id="Uhausnr"/>
<element id="Uplz">00000</element>
<element id="Uort">Musterstadt</element>
<element id="knri1">DE</element>
<element id="Uart">
</element>
<element id="Utelefon">+49 9999 6677-0</element>
<element id="Uemail">info@domain.com</element>
<element id="Hname"/>
<element id="Hart"/>
<element id="Hstrasse"/>
<element id="Hhausnr"/>
<element id="Hplz"/>
<element id="Hort"/>
<element id="Htelefon"/>
<element id="Hemail"/>
<element id="quartal">1. Quartal</element>
<element id="zlnr">T0000000</element>
<element id="ffw_version">ZM_Formular_online V1.0</element>
</datarow>
<dataset id="tbl_ZM_tabelle">
<datarow>
<element id="knre1">AT</element>
<element id="knre2">U14600000</element>
<element id="dreieck">false</element>
<element id="betrag">-90</element>
</datarow>
</dataset>
<datarow>
<element id="knre1">AT</element>
<element id="knre2">U14600001</element>
<element id="dreieck">false</element>
<element id="betrag">180</element>
</datarow>
</dataset>
SOLL-Zustand:
Erst die "datarow"s in "dataset" werden wichtig, die sollen dann in in eine CSV welche Kommagetrennt ist.
Die erste Zeile der CSV sollte "Laenderkennzeichen,USt-IdNr.,Betrag(EUR), Art der Leistung" enthalten.
Laenderkennzeichen ~ knre1 2 Großbuchstaben
USt-IdNr. ~ knre2
Betrag (EUR) ~ betrag Kann positiv und negativ sein. Nur ganze Zahlen
Art der Leistung ~ dreieck
Zudem soll die statt "false" in dreieck ein "L" stehen oder wenn "true" ein "D".
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 326517
Url: https://administrator.de/contentid/326517
Ausgedruckt am: 23.11.2024 um 01:11 Uhr
9 Kommentare
Neuester Kommentar
Servus,
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
$quelle = 'C:\daten\quelle.xml'
$ziel = 'C:\daten\elsterdaten.csv'
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}
$xml = [xml](gc $quelle)
$xml.'xml-data'.instance.dataset.datarow | %{
[pscustomobject]@{
'Laenderkennzeichen' = $_.element | ?{$_.id -eq 'knre1'} | %{$_.'#text'}
'USt-IdNr.' = $_.element | ?{$_.id -eq 'knre2'} | %{$_.'#text'}
'Betrag(EUR)' = $_.element | ?{$_.id -eq 'betrag'} | %{$_.'#text'}
'Art der Leistung' = @{'false'='L';'true'='D'}[($_.element | ?{$_.id -eq 'dreieck'} | %{$_.'#text'})]
}
} | export-csv $ziel -Delimiter ";" -Encoding UTF8 -NoType
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Hallo Florian,
kann ich nicht bestätigen. Deine XML oben ist übrigens nicht XML valide. Mit einer korrigierten Variante der XML geht es einwandfrei!
Bitte verwende mindestens PS 3.0 für das obige Skript!
Wenn du noch PS 2.0 verwendest muss Zeile 6 in
geändert werden.
Ansonsten musst du uns auch eine "korrekte" XML Datei liefern.
Grüße Uwe
kann ich nicht bestätigen. Deine XML oben ist übrigens nicht XML valide. Mit einer korrigierten Variante der XML geht es einwandfrei!
Bitte verwende mindestens PS 3.0 für das obige Skript!
Wenn du noch PS 2.0 verwendest muss Zeile 6 in
new-object PSObject -Property @{
Ansonsten musst du uns auch eine "korrekte" XML Datei liefern.
Grüße Uwe
Zur Info: Hier läufts testweise auch aber die XML muss wie von @colinardo gesagt korrigiert werden die hat Fehler.
Zitat von @Shaijan:
Ja mega. Vielen Dank
Das kleinste über wäre nun noch die Reichenfolge in der CSV zu ändern.
Einfach noch ein Select in der gewünschten Reihenfolge der Spaltennamen vor den Export schalten Ja mega. Vielen Dank
Das kleinste über wäre nun noch die Reichenfolge in der CSV zu ändern.
$quelle = 'C:\daten\quelle.xml'
$ziel = 'C:\daten\elsterdaten.csv'
$xml = [xml](gc $quelle)
$xml.'xml-data'.instance.dataset.datarow | %{
new-object PSObject -Property @{
'Laenderkennzeichen' = $_.element | ?{$_.id -eq 'knre1'} | %{$_.'#text'}
'USt-IdNr.' = $_.element | ?{$_.id -eq 'knre2'} | %{$_.'#text'}
'Betrag(EUR)' = $_.element | ?{$_.id -eq 'betrag'} | %{$_.'#text'}
'Art der Leistung' = @{'false'='L';'true'='D'}[($_.element | ?{$_.id -eq 'dreieck'} | %{$_.'#text'})]
}
} | select 'Laenderkennzeichen','USt-IdNr.','Betrag(EUR)','Art der Leistung' | export-csv $ziel -Delimiter ";" -Encoding UTF8 -NoType
Wenns das dann war noch ein Gelöst dran.
Gruß mik
Gruß mik