shaijan
Goto Top

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"

<?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>
16-01-_2017_08-06-12
ist-zustand

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".
soll-zustand

Content-ID: 326517

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

Ausgedruckt am: 23.11.2024 um 01:11 Uhr

131381
131381 16.01.2017 um 09:40:32 Uhr
Goto Top
Hier steht wie's geht:
XML in CSV umwandeln

Gruß mik
colinardo
colinardo 16.01.2017, aktualisiert am 17.01.2017 um 14:06:14 Uhr
Goto Top
Servus,
$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  
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
Shaijan
Shaijan 17.01.2017 um 13:53:53 Uhr
Goto Top
Hallo Uwe,

Leider wird nur eine leere csv generiert.

Gruß
Florian
colinardo
colinardo 17.01.2017 aktualisiert um 14:07:26 Uhr
Goto Top
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
new-object PSObject -Property @{
geändert werden.

Ansonsten musst du uns auch eine "korrekte" XML Datei liefern.

Grüße Uwe
131381
131381 17.01.2017 aktualisiert um 14:11:10 Uhr
Goto Top
Zur Info: Hier läufts testweise auch aber die XML muss wie von @colinardo gesagt korrigiert werden die hat Fehler.
Shaijan
Shaijan 17.01.2017 um 16:36:01 Uhr
Goto Top
Ja mega. Vielen Dank face-smile
Das kleinste über wäre nun noch die Reichenfolge in der CSV zu ändern. Wenn das nicht zuviel Zeit kostet ansonsten werde ich morgen früh gleich mal los legen.
colinardo
Lösung colinardo 17.01.2017 aktualisiert um 16:40:05 Uhr
Goto Top
Zitat von @Shaijan:

Ja mega. Vielen Dank face-smile
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 face-wink
$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  
131381
131381 17.01.2017 um 16:51:31 Uhr
Goto Top
Wenns das dann war noch ein Gelöst dran.

Gruß mik
Shaijan
Shaijan 18.01.2017 um 14:19:36 Uhr
Goto Top
Vielen Dank Uwe aka colinardo und mikrotik.
Ihr seid Spitze!