Powershell und XMLs -Von definierten XML Tags die Werte ändern
Hallo Zusammen
Ich steh wohl grad bisschen auf dem Schlauch.
Ich habe ein XML mit folgendem Aufbau:
Ziel dieser Übung ist es nun, die Werte (100000,1234567) anhand den zuvor definierten Xml-Tags (<f1_05_0_>, <f4_36_0_>) zu formatieren, dass die Werte folgende ins XML geschrieben werden: 100,000,1,234,567.
Soa.. Werte auslesen klappt, formatieren auch.. Was mir aktuell noch schleierhaft ist, wie ich auf die XML Tags abfragen kann. Mit dem Beispiel des Tags <f4_36_0_> als $xmltag, $xml = get-content xmlpfad..:
Nun weiss aber nicht, wie ich dieses Foreach so setzen kann das auf die Tag's eingegangen wird? aktuell erscheinen mir nur immer die Werte...
Wisst ihr Rat?
Beste Grüsse
Ich steh wohl grad bisschen auf dem Schlauch.
Ich habe ein XML mit folgendem Aufbau:
<?xml Version="1.0" encoding="UTF-8" standalone="yes"=>
<topmostSubform>
<f1_04_0_>9000</f1_04_0_>
<f1_05_0_>100000</f1_05_0>
.
.
.
<f4_36_0_>1234567</f4_36_0_>
<f3_25_0_>112233</f4_36_0_>
</topmostSubform>
Ziel dieser Übung ist es nun, die Werte (100000,1234567) anhand den zuvor definierten Xml-Tags (<f1_05_0_>, <f4_36_0_>) zu formatieren, dass die Werte folgende ins XML geschrieben werden: 100,000,1,234,567.
Soa.. Werte auslesen klappt, formatieren auch.. Was mir aktuell noch schleierhaft ist, wie ich auf die XML Tags abfragen kann. Mit dem Beispiel des Tags <f4_36_0_> als $xmltag, $xml = get-content xmlpfad..:
foreach($xmltag in $xml.topmostSubform.[??])
{
lese den wert aus, falls mehr als 3 stellen setzte Kommas und schreibs zurück
}
Nun weiss aber nicht, wie ich dieses Foreach so setzen kann das auf die Tag's eingegangen wird? aktuell erscheinen mir nur immer die Werte...
Wisst ihr Rat?
Beste Grüsse
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 305301
Url: https://administrator.de/contentid/305301
Ausgedruckt am: 20.11.2024 um 04:11 Uhr
10 Kommentare
Neuester Kommentar
Zuerst mal dein XML ist absolut nicht regelkonform und enthält diverse Fehler (in der Deklaration und Start und Endtags stimmen nicht überein):
Beispiel (der XML-Code ist nur zum Beispiel als Variable eingebunden):
Alternativ für die Schleife auch:
Gruß skybird
Nun weiss aber nicht, wie ich dieses Foreach so setzen kann das auf die Tag's eingegangen wird? aktuell erscheinen mir nur immer die Werte...
Beispiel (der XML-Code ist nur zum Beispiel als Variable eingebunden):
[xml]$xml = @"
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<topmostSubform>
<f1_04_0_>9000</f1_04_0_>
<f1_05_0_>100000</f1_05_0_>
<f4_36_0_>1234567</f4_36_0_>
<f3_25_0_>112233</f3_25_0_>
</topmostSubform>
"@
# Knoten unterhalb von topmostSubform durchlaufen
$xml.SelectNodes('//topmostSubform//*') | %{
"Name des Knotens: " + $_.Name
"Wert des Knotens: " + $_.innerText
}
$xml.topmostSubform.ChildNodes | %{
"Name des Knotens: " + $_.Name
"Wert des Knotens: " + $_.innerText
}
Zitat von @rdklie:
Erstmal vielen Dank für deine Antwort.
Jep, das XML ist echt bullsh*t (sorry für die Wortwahl).. Ist aber leider ein export aus Acrobat. Leider muss ich wirklich die zu formatierenden Tags angeben, ansonsten werden Postleitzahlen auch formatiert
Dein Code ist aber leider auch nicht besser,, Stichwort Schreibfehler: Childnotes...Erstmal vielen Dank für deine Antwort.
Jep, das XML ist echt bullsh*t (sorry für die Wortwahl).. Ist aber leider ein export aus Acrobat. Leider muss ich wirklich die zu formatierenden Tags angeben, ansonsten werden Postleitzahlen auch formatiert
Nun, wenn ich folgende Zeile eingebe, stimmt das ausgegebene Resultat:
Es erscheinen nur die Tag's bzw deren Bezeichnung (ohne <> drumrum)
Ja nee, wenn dann so:$xml.topmostSubform.Childnotes | % { $_.Name}
$arr2 = $xml.topmostSubform.Childnodes
foreach($x in $arr2){
"Nodename: " + $x.Name
"Nodewert: " + $x.innerText
}
langsam ich machs zu kompliziert
Nein du hast nur anscheinend kein Verständnis für die Objekte in der Shell ...Das %{} das ich oben verwendet habe ist auch nur eine Abkürzung für eine Foreach-Schleife
OK jetzt ist mir einiges klarer was du tatsächlich machen willst. Das lässt sich auf das hier verkürzen
Achte auf deine Powershell-Version den Operator -in gibt es erst ab Powershell Version 3.0
$xml = [xml](get-content 'C:\temp\xml.xml')
$xml.topmostSubForm.childNodes | ?{$_.Name -in @('f1_05_0_','f4_36_0_')} | %{
$_.innerText = "{0:0,0}" -f [int32]$_.innertext
}
$xml.Save('C:\temp\xml_fertig.xml')
Das passende Beispiel dafür hatte ich ganz zu Anfang gepostet:
Nutze XPath
Nutze XPath
$xml = [xml](get-content 'C:\temp\xml.xml')
$xml.SelectNodes('//topmostSubform//*') | ?{$_.Name -in @('f1_05_0_','f4_36_0_')} | %{
$_.innerText = "{0:0,0}" -f [int32]$_.innertext
}
$xml.Save('C:\temp\xml_fertig.xml')
Nö das Sternchen erfasst alle Knoten auch weitere Subnodes!! Du hast einen Slash hinter topmostSubform vergessen s.o. ...
Dann werden wirklich alle Knoten rekursiv unterhalb 'topmostSubForm' durchsucht, bei deiner Variante nur zwei Level.
('//topmostSubform//*')