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-Key: 326517

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

Printed on: April 25, 2024 at 22:04 o'clock

Mitglied: 131381
131381 Jan 16, 2017 at 08:40:32 (UTC)
Goto Top
Hier steht wie's geht:
XML in CSV umwandeln

Gruß mik
Member: colinardo
colinardo Jan 16, 2017, updated at Jan 17, 2017 at 13:06:14 (UTC)
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
Member: Shaijan
Shaijan Jan 17, 2017 at 12:53:53 (UTC)
Goto Top
Hallo Uwe,

Leider wird nur eine leere csv generiert.

Gruß
Florian
Member: colinardo
colinardo Jan 17, 2017 updated at 13:07:26 (UTC)
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
Mitglied: 131381
131381 Jan 17, 2017 updated at 13:11:10 (UTC)
Goto Top
Zur Info: Hier läufts testweise auch aber die XML muss wie von @colinardo gesagt korrigiert werden die hat Fehler.
Member: Shaijan
Shaijan Jan 17, 2017 at 15:36:01 (UTC)
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.
Member: colinardo
Solution colinardo Jan 17, 2017 updated at 15:40:05 (UTC)
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  
Mitglied: 131381
131381 Jan 17, 2017 at 15:51:31 (UTC)
Goto Top
Wenns das dann war noch ein Gelöst dran.

Gruß mik
Member: Shaijan
Shaijan Jan 18, 2017 at 13:19:36 (UTC)
Goto Top
Vielen Dank Uwe aka colinardo und mikrotik.
Ihr seid Spitze!