cologne
Goto Top

XML Wert mithilfe von Powershell unter MsgId auf das Wort HALLO ändern

Ich nehme nur Paar Zeilen aus dem Code - es sollte ja reichen.

Der Wert zwischen <MsgId> muss dann geändert werden auf irgendwas, als Beispiel auf das Wort: HALLO

<GrpHdr>
<MsgId>GF-BWKES24093HBK025632</MsgId>
<CreDtTm>2023-06-24T17:57:47

Wenn ich aber dies hier im PS ausführe:


$filePath = "C:\test.xml"  
$xml = [xml](Get-Content $filePath)
$xml.SelectSingleNode("//MsgId").InnerText = "HALLO"  
$xml.Save($filePath)

Sagt er mir: die Eigenschaft "InnerText" wurde für dieses Objekt nicht gefunden.

Wer kann hier helfen?

Content-Key: 42717204942

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

Printed on: May 18, 2024 at 03:05 o'clock

Member: michi1983
michi1983 Apr 10, 2024 at 09:08:28 (UTC)
Goto Top
Hallo,

wenn ich mir die Doku anschaue, würde ich das so versuchen:
$filePath = "C:\test.xml"   
[xml]$Types = Get-Content $filePath
Select-Xml -Xml $Types -XPath "//MsgId"  

und dann ev. mit innerxml weiter arbeiten.

Versuch macht kluch.

Gruß
Mitglied: 12168552861
12168552861 Apr 10, 2024 updated at 09:27:46 (UTC)
Goto Top
Auch kein Hallo.
Ich nehme nur Paar Zeilen aus dem Code - es sollte ja reichen.
Nein, der Kontext ist in dem Fall wichtig wenn man per XML-Objekt arbeitet!

Wenn oberhalb Namespaces vorkommen müssen diese bei Verwendung einer XPath Abfrage zwingend berücksichtigt werden sonst lieferr die Abfrage kein Ergebnis und somit keinen Knoten zurück!
XML in PowerShell: XPath-Abfragen und Namespaces
Oder du verwendest statt SelectSingleNode den ganzen Pfad dahin mittels bspw.
$xml.RootKnoten.Subknoten.GrpHdr.MsgId = "Hallo"  


https://tio.run/##bY9dT8IwFIbv@yuahgSWsHWCGiXbQBIFg4OLkUhivCjbccN07dIWh7 ...

Auch kein Gruß
Member: cologne
cologne Apr 10, 2024 at 09:26:07 (UTC)
Goto Top
Hallo face-smile

<FITOEICstmrCdtTrE>
xmlns="urn:iso: std:iso: 20022: tech: xsd: pacs. 008.001.08">  
<GrpHdr>
‹Msg Id>GF-BWWFS24093HBK023875395</MsgId>
<CreDtTm>2024-04-04T17:57:47. 5382</CreDtTm>
<NbOfTxs>1</NbOfTxs>
<TtlIntrBkSttlmAmt
Ссу="EUR" >1000</TtlIntrBkSttlmAmt>  
<IntrBkSttlmDt>2023-06-06</IntrBkSttlmDt>
<SttlmInf>
<SttlmMtd>CLRG</Stt1mMtd>
<C1rSys>
‹Prtry>TIPS</Prtry>
</CIrSys>
</SttlmInf>
< PmtTpInf>
<SvcLvl>
<Cd>SEPA</cd>
</ SvcLvl>
<LclInstrm>
<Cd> INST</Cd>
</LclInstrm>
</ PmtTpInf>
<InstgAgt>
< FinInstnId>
<BICFI>CMCIDEDD</BICEI>
</FinInstnId>
</ InstgAgt>
</GrpHdr>
<CdtTrfTxInf>
</EITOEICstmrCdtTrf>
Member: cologne
cologne Apr 10, 2024 at 09:28:23 (UTC)
Goto Top
mit ganzem Prag sagt er: Die Eigenschaft "MsgId" wurde für dieses Objekt nicht gefunden.
Member: michi1983
michi1983 Apr 10, 2024 at 09:29:51 (UTC)
Goto Top
Bitte nutze Code Tags!
Mitglied: 12168552861
Solution 12168552861 Apr 10, 2024 updated at 10:06:34 (UTC)
Goto Top
RTFM Link oben ...

$filePath = "C:\test.xml"    
$xml = [xml](Get-Content $filePath)
$ns = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
$ns.AddNamespace("ns","urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08")  
$node = $xml.SelectSingleNode("//ns:MsgId",$ns)  
If ($node){
    $node.innerText = "Hallo"  
    $xml.Save($filePath)
}else{
    Write-warning "Knoten nicht existent."  
}

https://tio.run/##bY9dT8IwFIbv@yuahgSWsHWCGiXbQBIFg4OLkUhivCjbccN07dIWh7 ...
Member: cologne
cologne Apr 10, 2024 at 09:52:32 (UTC)
Goto Top
Leider ändert er nix face-sad
Gruß

PS C: \test> $filepath = "C: \test\tips.xml"  
Sxml = [xm1] (Get-Content $filepath)
Sns = New-Object System. Xml. XmNamespaceManager ($xml. NameTable)
$ns -AddNameSpace ("ns"  
"urn: iso: std:iso: 20022: tech: xsd: pac. 008.001.08")  
Snode = Sxm1. SelectsingleNode(" //ns:MsgId", $ns)  
If (Snode){
Snode. innerText = "Hallo"  
$xm1. Save($filepath) }elsef
Write-warning
"Knoten nicht existent"}  
WARNUNG: Knoten nicht existent
Mitglied: 12168552861
12168552861 Apr 10, 2024 updated at 09:58:40 (UTC)
Goto Top
Kein Wunder du hast meinen Code ja total verunstaltet deiner ist voller Syntaxfehler fehlender Kommas etc pp.!!
Und der Namespace muss 100% passen, also prüfe ob da nicht ein Leerzeichen zu viel oder zu wenig da ist!

Das es funktioniert siehst du ja an der Demo unter tio.run

Also Brille aufsetzen und richtig machen dann klappt das auch.
Member: cologne
cologne Apr 10, 2024 at 09:59:07 (UTC)
Goto Top
Eigentlich ohne Fehler alles.
bildschirmfoto 2024-04-10 um 11.58.48
Mitglied: 12168552861
Solution 12168552861 Apr 10, 2024 updated at 13:28:57 (UTC)
Goto Top
Dann stimmt dein Namespace nicht zu 100% und du hast ihn uns hier wegen fehlender Codetags falsch gepostet und so wieder übernommen. Vermute die ganzen Leerzeichen im Namespace sind fehlerhaft, wie dein Code der ebenso hier falsch angekommen ist ... Übernehme ihn doch mal so
$ns.AddNamespace("ns","urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08")  
Den Original XML Text hast ja nur du ... Und wir sind darauf angewiesen was du hier postest🫤.
Member: cologne
cologne Apr 10, 2024 at 10:13:04 (UTC)
Goto Top
Top. Danke Dir!!! hat jetzt funktioniert. Mega! Ich bedanke mich.
Member: cologne
cologne Apr 17, 2024 at 11:34:09 (UTC)
Goto Top
Grüß dich.

Ich wollte jetzt andere Logik bauen, kriege aber Probleme.

Die Idee ist, dass das Skript in ganzem Ordner alle Dateien durchguckt und dann z.B. den Inhalt des Attributes <NM> in allen Dateien ändert.

# Define the target folder
$targetFolder = "C:\Test"  

# Get all files in the folder
$files = Get-ChildItem -Path $targetFolder -Recurse -File

# Process each file
foreach ($file in $files) {
    # Load the XML content
    $xml = [xml](Get-Content $file.FullName)

    # Create a namespace manager and add the default namespace (if necessary)
    $ns = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
    $ns.AddNamespace("", "")  # Only add if your XML uses default namespace  

    # Select all elements with the "NM" attribute 
    $nodes = $xml.SelectNodes("//*[@NM]", $ns)  

    # Update the attribute content for each found node
    if ($nodes) {
        foreach ($node in $nodes) {
            $node.Attributes["NM"].InnerText = "Test"  
        }

        # Save the modified XML document
        $xml.Save($file.FullName)
    }
}


Am Ende kommt aber der Fehler:

< : Die Benennung "<" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die
Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In D:\Test\Pacs.ps1:130 Zeichen:1

back-to-top</SCLSDD:BBkDNFBlkDirDeb>

back-to-top~

+ CategoryInfo : ObjectNotFound: (<:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException