Convert From Csv to Eulanda Meta Xml
Zuletzt geändert: 14.03.2026 05:56

ConvertFrom-CsvToEulandaMetaXml #

ÜBERSICHT #

Wandelt CSV-Dateien anhand einer Mapping-JSON generisch in EULANDA-META-XML um.

SYNTAX #

ConvertFrom-CsvToEulandaMetaXml [-SourcePath] <string> [-OutputDirectory] <string> [-MappingPath]
    <string> [[-Encoding] <string>] [-ValidateSchema] [[-SchemaPath] <string>] [[-DocumentType]
    <string>] [<CommonParameters>]

BESCHREIBUNG #

Liest eine CSV-Datei und erzeugt EULANDA-konformes XML über eine Mapping-JSON. Die Mapping-JSON ist der zentrale Baustein der Konvertierung: Sie beschreibt, wie CSV-Spalten und Konstanten in XML-Knoten und XML-Elemente überführt werden.

Nach dem Erzeugen wird die XML mit Get-SortedXmlString XSD-konform sortiert. Optional wird anschließend gegen ein XSD validiert.

————————————————————————– Aufbau der Mapping-JSON ————————————————————————–

  1. Top-Level Eigenschaften
  • DocumentType (string, erforderlich) DocumentType steuert u.a. die Sortierlogik (z.B. AUFTRAGPOSLISTE am Ende) und kann in Templates als {DocumentType} verwendet werden. Beispiele: “AUFTRAG”, “ANGEBOT”, “RECHNUNG”, “ARTIKEL”

  • GroupByColumn (string, optional) Wenn gesetzt, wird die CSV nach dieser Spalte gruppiert und pro Gruppe eine XML-Datei erzeugt (GroupKey = Gruppenwert). Beispiel: “Bestellnummer”

  • OutputFileTemplate (string, optional) Dateiname als Template. Unterstützte Platzhalter: {DocumentType} -> DocumentType {GroupKey} -> Gruppenwert (Original) {GroupKeySafe} -> Gruppenwert bereinigt (dateinamensicher) Beispiel: “ORDER ({GroupKeySafe}).xml” Wenn nicht gesetzt: “{DocumentType} ({GroupKeySafe}).xml”

  • SchemaPath (string, optional) Pfad zur XSD-Datei. Relativ zur Mapping-JSON oder absolut. Wird genutzt, wenn -ValidateSchema gesetzt ist.

  • Constants (object/hashtable, optional) Konstanten, die über Tokens referenziert werden können (Keys ohne %). Beispiel: “Constants”: { “EUR”: “EUR”, “Zero”: “0.00” } Verwendung im Mapping: { “Token”: “%EUR” } oder als String “%EUR”

  1. Tokens Tokens werden in Mappingdefinitionen über % genutzt:
  • %KEY Sucht KEY in Constants. Wenn nicht vorhanden, wird “KEY” als Text geliefert.

  • %NOW:Format Aktuelles Datum/Uhrzeit. Format nach .NET DateTime.ToString(). Standardformat wenn weggelassen: yyyy-MM-ddTHH:mm:ss

  • %TODAY:Format Heutiges Datum. Standardformat wenn weggelassen: yyyy-MM-ddT00:00:00

  1. Root-Block
  • Root (object, erforderlich) Root beschreibt das XML-Grundgerüst ab dem Root-Knoten. Typischerweise: “Root”: { “Name”: “EULANDA”, “Children”: [ … ] }

    Eigenschaften:

    • Name (string, optional, Default “EULANDA”) Kann Templates enthalten, z.B. “EULANDA”.

    • Elements (object, optional) Map: ZielElementName -> Definition Schreibt Leaf-Elemente direkt unter Root.

    • Children (array, optional) Liste von NodeSpec-Objekten, die rekursiv erzeugt werden.

  1. NodeSpec (Knoten-Definition) Ein NodeSpec beschreibt einen XML-Knoten und optional dessen Kinder.

Eigenschaften eines NodeSpec:

  • Name (string, erforderlich) Name des zu erzeugenden XML-Elements. Darf Templates enthalten: “{DocumentType}LISTE”, “{DocumentType}POSLISTE”, “{DocumentType}POS”

  • Source (string, optional) Steuert, aus welcher CSV-Zeile Werte gelesen werden: “firstRow” -> erste Zeile der Gruppe (Kopf) “row” -> aktuelle Zeile (z.B. innerhalb Positionsliste) Wenn nicht gesetzt: wenn Context.Row vorhanden -> row, sonst firstRow.

  • Elements (object, optional) Map: ZielElementName -> Definition Schreibt Leaf-Elemente unter diesen Node.

  • Children (array, optional) Unterknoten als weitere NodeSpec-Objekte.

  • OmitIfEmpty (bool, optional, Default false) Wenn true, wird der Node nicht angehängt, falls keine Element-Kinder erzeugt wurden.

  1. Listenmodus (ForEach=“rows”) Ein NodeSpec kann eine Liste erzeugen, indem ForEach auf “rows” gesetzt wird.

Zusätzliche Eigenschaften:

  • ForEach (string) = “rows” Iteriert über Context.Rows (alle CSV-Zeilen der Gruppe).

  • ItemName (string, erforderlich bei ForEach=“rows”) Name des Item-Knotens pro Zeile, z.B. “{DocumentType}POS”

  • Counter (object, optional) Erzeugt automatisch ein Zähler-Element im Item, z.B. POSNUMMER.

  • Target (string) -> Name des Ziel-Elements, z.B. “POSNUMMER”

  • Column (string) -> CSV-Spalte (optional). Wenn vorhanden und gefüllt, wird sie genutzt.

  • Start (int) -> Startwert (Default 1)

Hinweis: Wenn Counter.Target zusätzlich in Elements gemappt wäre, wird dieser Eintrag für das Item entfernt, um doppelte Ausgabe zu vermeiden.

  1. Element-Definitionen (Values in Elements-Maps) Eine Definition kann ein String oder ein Object/Hashtable sein.

a) String-Definition

  • “Spaltenname” -> liest Wert aus CSV-Spalte
  • “%TOKEN” -> löst Token auf (Constants / NOW / TODAY)

b) Object/Hashtable-Definition Unterstützte Keys:

  • Value (string) Fixer Textwert.

  • Token (string, beginnt mit %) Tokenwert, z.B. “%EUR”, “%NOW:yyyy-MM-ddTHH:mm:ss”

  • Column (string) CSV-Spaltenname.

  • Trim (bool, optional) Wenn Column genutzt wird, steuert Trim das Abschneiden von Leerzeichen.

  • Columns (array of string) + Join (string, optional) Mehrere CSV-Spalten zusammensetzen, z.B. Anrede + Name. Join ist der Trenner, z.B. " “.

  • Default (string) Wird nur verwendet, wenn der ermittelte Wert leer oder $null ist. Kann Token oder Text sein.

  • Lookup (object/hashtable) Optionales Mapping, z.B. Autokennzeichen -> ISO-Land. Verhalten:

  • Wenn ein Wert vorhanden ist und ein Lookup-Treffer existiert: ersetze Wert.

  • Wenn kein Treffer existiert, aber Wert vorhanden ist: Wert bleibt erhalten (getrimmt).

  • Default greift nur bei leerem Eingangswert (vor Lookup).

  • Type (string) Unterstützt: “DateTime”, “Decimal” Die Typumwandlung erfolgt nach Default und nach Lookup.

  • DateTime: TryParse (InvariantCulture, danach CurrentCulture), Ausgabe via Format.

  • Decimal: TryParse (CurrentCulture, danach InvariantCulture), Ausgabe InvariantCulture.

  • Format (string) Nur relevant bei Type=“DateTime”. Default: “yyyy-MM-ddTHH:mm:ss”.

————————————————————————– Minimalbeispiel (Struktur) ————————————————————————– { “DocumentType”: “AUFTRAG”, “GroupByColumn”: “Bestellnummer”, “OutputFileTemplate”: “ORDER ({GroupKeySafe}).xml”, “SchemaPath”: “schema/EULANDA-orders.xsd”, “Constants”: { “EUR”: “EUR”, “Zero”: “0.00” }, “Root”: { “Name”: “EULANDA”, “Children”: [ { “Name”: “METADATA”, “Elements”: { “DATE”: { “Token”: “%NOW:yyyy-MM-ddTHH:mm:ss” } } }, { “Name”: “{DocumentType}LISTE”, “Children”: [ { “Name”: “{DocumentType}”, “Children”: [ … ] } ] } ] } }

————————————————————————– Benötigte Hilfsfunktionen im Scope ————————————————————————–

  • Get-CsvRowFieldValue
  • Get-EulandaTokenValue
  • Get-EulandaMappedValue
  • Add-EulandaXmlElementsFromMap
  • Get-SortedXmlString Optional für -ValidateSchema:
  • Test-ValidateXml

PARAMETER #

-SourcePath #

Type: string

Pfad zur CSV-Quelldatei.

-OutputDirectory #

Type: string

Zielverzeichnis für die erzeugten XML-Dateien.

-MappingPath #

Type: string

Pfad zur Mapping-JSON.

-Encoding #

Type: string
Default: 'UTF8'

Zeichencodierung der CSV (UTF8 oder ANSI). Ausgabe ist immer UTF-8 ohne BOM.

-ValidateSchema #

Type: switch

Wenn gesetzt, wird die XML gegen das XSD validiert.

-SchemaPath #

Type: string

Optionaler Pfad zur XSD. Wenn nicht gesetzt, wird SchemaPath aus der JSON genutzt. Wenn JSON keinen SchemaPath hat, wird nicht validiert (auch wenn -ValidateSchema gesetzt ist -> Fehler).

-DocumentType #

Type: string

Optionaler Override für DocumentType aus der JSON.

AUSGABEN #

string[]

Liste der erzeugten XML-Dateipfade.

BEISPIELE #

# CSV nach EULANDA-META-XML über JSON-Mapping konvertieren
ConvertFrom-CsvToEulandaMetaXml `
  -SourcePath '.\wulff.csv' `
  -OutputDirectory '.\out' `
  -MappingPath '.\WULFF.json'
# CSV konvertieren und anschließend gegen XSD validieren
ConvertFrom-CsvToEulandaMetaXml `
  -SourcePath '.\wulff.csv' `
  -OutputDirectory '.\out' `
  -MappingPath '.\WULFF.json' `
  -ValidateSchema