epsodus
Goto Top

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.

$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>

Content-Key: 565225

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

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

Mitglied: 143728
Solution 143728 Apr 17, 2020 at 11:11:03 (UTC)
Goto Top
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
}
Member: epsodus
epsodus Apr 18, 2020 at 14:59:51 (UTC)
Goto Top
Hallo cabrinha,

vielen Dank, das habe ich jetzt verstanden. Ich habe mir dazu eine kleine Zeichnung gemacht und
dazu die Zuweisungen eingetragen, für mich sieht es wie eine Zwiebelkschale aus. mit den Abhängigkeiten.

Danke.

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.
Mitglied: 143728
143728 Apr 18, 2020 updated at 16:04:42 (UTC)
Goto Top
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.


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*')] | .................  
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
If ($text -like '*1TRANS*'){  
    $text = $text | select -Skip 1
}
$text | Set-Content -Path $_.FullName -Encoding UTF8
ergibt das selbe.

Ab und zu etwas Abwechslung vom schnöden "if" tut ganz gut face-smile. 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 ...
Member: epsodus
epsodus Apr 22, 2020 at 04:58:19 (UTC)
Goto Top
Hallo Cabrinha,
vielen Dank, nun habe ich es verstanden. Werde mich damit ein wenig beschäftigen. Vielleicht kannst Du mir noch einmal helfen. Ich habe das obige
XML Script ein wenig abgeändert.

Mit der unteren IF Anfrage schaue ich im XML File auf folgende Zeile:
 <TechRcrdId>BANANNANANAxxWWWxxTTTTxxZZZxxTL555xx109860</TechRcrdId>

und wenn split("xx")[10]) zutrifft, dann setze diesen Wert ( hierbei 109860 ) vor dem Dateinamen und speichere es ab. Wenn nicht dann die
Bedingung aus else.


Kann man auch abfragen ob in

<TechRcrdId>BANANNANANAxxWWWxxTTTTxxZZZxxTL555xx109860</TechRcrdId>

TL555 und 109860 ( immer an der gleichen Stellen ) vorhanden ist? Und den vorhandenen Dateinamen ( $DTCC_FILE )wie folgt abspeichern:  TL555.109860.$DTCC_FILE.

z.B. mit der regex?

"<TechRcrdId>BANANNANANAxxWWWxxTTTTxxZZZxx[A-Z]{2}[0-9]{3}xx[0-9]{6}</TechRcrdId>"   

Im TchRcrdID stehen an den besagten Stellen immer andere Werte.



"function dtcc_RSRXML"  
		
	$inputXMLFile = Join-Path -Path $DTCC_ROOT -ChildPath $DTCC_FILE
	$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){

		# aus Note TechRcrdId das 10 Element vor den Filenamen setzen		
		$Test = ($ChildNode.TechRcrdId.split("xx")[10])  
		
		if ($TEST -match "[0-9]{6}")  
		{
			$CurrentXMLFileName = Join-Path -Path $DTCC_ROOT -ChildPath ($ChildNode.TechRcrdId.split("xx")[10].ToString() + "." +       $DTCC_FILE)  
			
		}
		else
		{
			$CurrentXMLFileName = Join-Path -Path $DTCC_ROOT -ChildPath ($ChildNode.TxId.UnqTradIdr.ToString() + "." + $DTCC_FILE)  
			#Write-Host $CurrentXMLFileName
		}
Mitglied: 143728
Solution 143728 Apr 23, 2020 updated at 14:50:08 (UTC)
Goto Top
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"  
}
Member: epsodus
epsodus Apr 23, 2020 at 14:44:04 (UTC)
Goto Top
Danke, ich habe noch viel zu lernen. Deine Lösung hätte ich nicht hinbekommen.