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 ————————————————————————–
- 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”
- 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
- 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.
- 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.
- 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.
- 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