XML File Erstellung
Hallo zusammen,
ein XML File zu erstellen ist schon schwierig, dabei habe ich erhebliche Probleme bzw. dies verstehe ich nicht so ganz.
Könnte mir dabei jemand helfen und es es mit wenigen Worten erklären? Durch Goog.... wurde ich auch nicht schlauer.
Folgendes konnte schon gemacht werden, ich glaube da gibt es bestimmt auch einen Fehler.
Vielleicht kann mir jemand dazu eine kurze Erklärung geben, ich bekomme keine zusätzlichen atributte eingefügt.
So wie es aussieht kann ich hier keine Beispieldatei anfügen, aus der mein XML erstellt wird.
Wenn dieser Code ausgeführt wird, bekomme ich folgendes XML File:
Ich möchte das aber in XML wie folgt aufgebaut haben, so das zusäzlich Document und SctiesFincgRptgRcncltnStsAdvc noch eingefügt sind.
ein XML File zu erstellen ist schon schwierig, dabei habe ich erhebliche Probleme bzw. dies verstehe ich nicht so ganz.
Könnte mir dabei jemand helfen und es es mit wenigen Worten erklären? Durch Goog.... wurde ich auch nicht schlauer.
Folgendes konnte schon gemacht werden, ich glaube da gibt es bestimmt auch einen Fehler.
Vielleicht kann mir jemand dazu eine kurze Erklärung geben, ich bekomme keine zusätzlichen atributte eingefügt.
So wie es aussieht kann ich hier keine Beispieldatei anfügen, aus der mein XML erstellt wird.
$startFolder = 'D:\sample'
$inputXML = 'TestXML.xml'
$inputXMLFile = Join-Path -Path $startFolder -ChildPath $inputXML
$xml = [xml](Get-Content $inputXMLFile)
# Schleife, jeden Note RcncltnRpt finden und mit Inhalt kopieren
Foreach ($ChildNode in $xml.BizData.Pyld.Document.SctiesFincgRptgRcncltnStsAdvc.RcncltnData.Rpt.RcncltnRpt) {
$CurrentXMLFileName = Join-Path -Path $startFolder -ChildPath ($ChildNode.$ChildNode.TxId.UnqTradIdr.ToString() + '.xml')
# neues XML Document erstellen
$NewXML = New-Object System.Xml.XmlDocument
# XML Declaration anlegen
$declaration = $NewXML.CreateXmlDeclaration("1.0", "UTF-8", $null)
$NewXML.AppendChild($declaration)
# Note BizData Anfang leer erstellen
$RootNode = $NewXML.CreateNode('element', 'BizData', $null)
$NewXML.AppendChild($RootNode)
#Import Note
$NewElement = $NewXML.ImportNode($ChildNode, $true)
# Note BizData Ende erstellen
$Root = $NewXML.SelectSingleNode('BizData')
$Root.AppendChild($NewElement)
# neues XML Document speichern
$NewXML.Save($CurrentXMLFileName)
}
Wenn dieser Code ausgeführt wird, bekomme ich folgendes XML File:
<BizData>
<RcncltnRpt>
<TechRcrdId>Dies ist ein Test</TechRcrdId>
<TxId>
<RptgCtrPty>
<REI>5299001234567890Q526</REI>
</RptgCtrPty>
<OthrCtrPty>
<REI>B81CK4E1234567890606</REI>
</OthrCtrPty>
<UnqTradIdr>BERTEDFRTGZHAKJH23000210</UnqTradIdr>
<MstrAgrmt>
<Tp>
<Tp>LRRP</Tp>
</Tp>
</MstrAgrmt>
</TxId>
<Modfd>false</Modfd>
<RcncltnSts>
<RptgData />
</RcncltnSts>
</RcncltnRpt>
</BizData>
Ich möchte das aber in XML wie folgt aufgebaut haben, so das zusäzlich Document und SctiesFincgRptgRcncltnStsAdvc noch eingefügt sind.
<?xml version="1.0" encoding="UTF-8"?>
<BizData>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:auth.080.001.01"
<SctiesFincgRptgRcncltnStsAdvc>
<RcncltnRpt>
<TechRcrdId>Dies ist ein Test</TechRcrdId>
<TxId>
<RptgCtrPty>
<REI>5299001234567890Q526</REI>
</RptgCtrPty>
<OthrCtrPty>
<REI>B81CK4E1234567890606</REI>
</OthrCtrPty>
<UnqTradIdr>BERTEDFRTGZHAKJH23000210</UnqTradIdr>
<MstrAgrmt>
<Tp>
<Tp>LRRP</Tp>
</Tp>
</MstrAgrmt>
</TxId>
<Modfd>false</Modfd>
<RcncltnSts>
<RptgData />
</RcncltnSts>
</RcncltnRpt>
<SctiesFincgRptgRcncltnStsAdvc>
<Document>
</BizData>
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 565225
Url: https://administrator.de/forum/xml-file-erstellung-565225.html
Ausgedruckt am: 21.04.2025 um 08:04 Uhr
6 Kommentare
Neuester Kommentar

Beispiel, damit solltest du es selbst hinbekommen
$xml = [xml]@'
<?xml version="1.0" encoding="UTF-8"?>
<BizData>
<Pyld>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:auth.080.001.01">
<SctiesFincgRptgRcncltnStsAdvc>
<RcncltnData>
<Rpt>
<RcncltnRpt>
<TechRcrdId>Dies ist ein Test</TechRcrdId>
<TxId>
<RptgCtrPty>
<REI>5299001234567890Q526</REI>
</RptgCtrPty>
<OthrCtrPty>
<REI>B81CK4E1234567890606</REI>
</OthrCtrPty>
<UnqTradIdr>BERTEDFRTGZHAKJH23000210</UnqTradIdr>
<MstrAgrmt>
<Tp>
<Tp>LRRP</Tp>
</Tp>
</MstrAgrmt>
</TxId>
<Modfd>false</Modfd>
<RcncltnSts>
<RptgData />
</RcncltnSts>
</RcncltnRpt>
</Rpt>
</RcncltnData>
</SctiesFincgRptgRcncltnStsAdvc>
</Document>
</Pyld>
</BizData>
'@
$xmlns = 'urn:iso:std:iso:20022:tech:xsd:auth.080.001.01'
$xml.BizData.Pyld.Document.SctiesFincgRptgRcncltnStsAdvc.RcncltnData.Rpt.RcncltnRpt | %{
# neues XML Document erstellen
$NewXML = [xml]'<?xml version="1.0" encoding="UTF-8"?><BizData></BizData>'
# Document Node mit Namespace erstellen
$nodeDocument = $newXml.CreateElement('Document',$xmlns)
# Subnode mit Namespace erstellen
$nodeScties = $newXml.CreateElement('SctiesFincgRptgRcncltnStsAdvc',$xmlns)
# Import des aktuellen Knotens inkl. Subknoten
$NewElement = $NewXML.ImportNode($_, $true)
# Importierten Knoten in 'SctiesFincgRptgRcncltnStsAdvc' Knoten anhängen
$nodeScties.AppendChild($NewElement)
# 'SctiesFincgRptgRcncltnStsAdvc' Node an den 'Document' Node anhängen
$nodeDocument.AppendChild($nodeScties)
# Einfügen des 'Document' Node in das DocumentElement (BizData) anhängen
$newxml.DocumentElement.AppendChild($nodeDocument)
# nur zur Demo XML ausgeben
$newxml.OuterXML
}

Es ist eigentlich ganz einfach. Du musst die Child-Nodes immer erst an den übergeordneten Parent-Node anhängen und zwar vom Kindknoten aus der am tiefsten in er Struktur liegt.
Zum Schluss hängst du dann den obersten Node an dem nun alle Childs eingehängt sind in die XML Struktur ganz oben am Document-Node (dem ersten und einzigsten Knoten eines XML Files) ein.
Du meinst diesen Abschnitt hier?:
Das ein Trick für die Abkürzung einer If-Abfrage, und zwar ist das eine Hashtable @{} mit zwei Elementen $true und $false. Die Bedingung steht hinter der Hashtable in den eckigen Klammern , ergibt die Bedingung $true wird der Inhalt der Hashtable aus dem $true - Teil ausgegeben (also der Teil ohne die erste Zeile) ansonsten der $false-Teil der Hashtable.
Du kannst das selbe auch mit einer Standard-If-Abfrage erreichen
ergibt das selbe.
Ab und zu etwas Abwechslung vom schnöden "if" tut ganz gut
. Leider gibt es in der vorinstallierten Powershell noch keinen ternären bedingten Operator wie in anderen Sprachen (z.B. in c#). Erst ab Powershell 7 gibt es ihn
Using the Ternary Conditional Operator in PowerShell 7
Für die ältere Powershell gibt's aber auch noch mehr alternative Konstruktionen für diese Fälle die nicht selten auftreten:
https://stackoverflow.com/questions/31341998/ternary-operator-in-powersh ...
Zum Schluss hängst du dann den obersten Node an dem nun alle Childs eingehängt sind in die XML Struktur ganz oben am Document-Node (dem ersten und einzigsten Knoten eines XML Files) ein.
Aber Deine Lösung auf meine Frage zu "XML File 1 Zeile ausschneiden" die habe ich noch nicht vertsanden, versuche es noch immer zu verstehen.
Du meinst diesen Abschnitt hier?:
@{$true=($text | select -Skip 1);$false = $text}[($text[0] -like '*1TRANS*')] | .................
Du kannst das selbe auch mit einer Standard-If-Abfrage erreichen
If ($text -like '*1TRANS*'){
$text = $text | select -Skip 1
}
$text | Set-Content -Path $_.FullName -Encoding UTF8
Ab und zu etwas Abwechslung vom schnöden "if" tut ganz gut
Using the Ternary Conditional Operator in PowerShell 7
Für die ältere Powershell gibt's aber auch noch mehr alternative Konstruktionen für diese Fälle die nicht selten auftreten:
https://stackoverflow.com/questions/31341998/ternary-operator-in-powersh ...

if ($ChildNode.TechRcrdId -match '([A-Z]{2}\d{3})xx(\d{6})$'){
$currentxmlfilename = Join-Path $DTCC_ROOT "$($matches[1]).$($matches[2]).$DTCC_FILE"
}else{
$currentxmlfilename = Join-Path $DTCC_ROOT "$($ChildNode.TxId.UnqTradIdr.ToString()).$DTCC_FILE"
}