jensxx1975
Goto Top

XML-Datei mit Powershell editieren, 2. Teil

Hallo zusammen,

habe hier aus dem Form eine Script-Zeile erhalten um ein XML-File zu editieren.

# Variable definieren
    $prefix = "Bogen_"  

    # Zählervariable erstellen
    $cnt = 0

    $xml.SelectNodes('//default:Component[@SignatureName]',$ns) | %{$_.Component.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"; $cnt++}   

Läuft wunderbar.

Nun möchte ich bestimmte Werte des Attributs „SheetName“ nicht ändern sondern überspringen.

Mein Versuch:

$xml.SelectNodes('//default:Component[@SignatureName]',$ns) | if ($_.Component.SheetName -eq "Bg_0") {$_.Component.SheetName = "Bg_0"} else | %{$_.Component.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"; $cnt++}  

Wirft leider eine Fehlermeldung:
if : Die Benennung "if" 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.

Hat jemand einen Tipp für mich?

Urspungs-Frage: XML-Datein per Script editieren

Besten Dank vorab!


Gruß JENS

Content-ID: 391494

Url: https://administrator.de/forum/xml-datei-mit-powershell-editieren-2-teil-391494.html

Ausgedruckt am: 22.12.2024 um 08:12 Uhr

H41mSh1C0R
H41mSh1C0R 02.11.2018 um 13:22:06 Uhr
Goto Top
Hi Jens,

dein Piping Konstrukt wird so nix.

Du kannst Nodes Selektieren und dann nach der Pipe z.B. mit ForEach oder andere Schreibweise "% { }" für jede einzelne Node weitermachen.

VG
Jensxx1975
Jensxx1975 02.11.2018 um 14:52:29 Uhr
Goto Top
Hallo!

Danke für Deine Antwort, aber ich stehe noch ziemlich auf dem Schlauch.

Ich habe das jetzt so umgestellt. (Ist noch nicht die endgültige Lösung, da ich eigentlich erreichen möchte das ein bestimmer Wert überhaupt nicht angefasst wird, aber ich will das besser verstehen)
    # Variable definieren
    $prefix = "Bogen_"  

    # Zählervariable erstellen
    $cnt = 0
    
    $xml.SelectNodes('//default:Component[@SignatureName]',$ns) | %{$_.Component.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"; $cnt++}  
    $xml.SelectNodes('//default:Component[@SignatureName]',$ns) | %{$_.Component.SheetName = "Bogen_00" -replace "Bogen_00", "Umschlag"}  



Die Zeile sorgt dafür das die Werte des Attributs "SheetName" in "Bogen_00....99" gewandelt werden:
$xml.SelectNodes('//default:Component[@SignatureName]',$ns) | %{$_.Component.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"; $cnt++}  



...und diese Zeile sollte doch den Wert "Bogen_00" mit "Umschlag" ersetzen.
    $xml.SelectNodes('//default:Component[@SignatureName]',$ns) | %{$_.Component.SheetName = "Bogen_00" -replace "Bogen_00", "Umschlag"}  

Es werden aber ALLE Attribute in "Umschlag" geändert. Irgdenwie logisch, wegen %.
Aber wenn ich mit If arbeite gibt's wieder ne Fehlermeldung.

$xml.SelectNodes('//default:Component[@SignatureName]',$ns) | if ($_.Component.SheetName = "Bogen_00") {$_.Component.SheetName -replace "Bogen_00", "Umschlag"}  


Danke!

Gruß JENS
H41mSh1C0R
Lösung H41mSh1C0R 02.11.2018 um 16:13:01 Uhr
Goto Top
Mal ein einfaches Beispiel:

Test.xml:

<?xml version="1.0" encoding="utf-8"?> 
<Eintraege>
<SheetName>
    Test1
</SheetName>
<SheetName>
    Umschlag
</SheetName>
<SheetName>
    Test2
</SheetName>
</Eintraege>

[XML]$Inhalt = get-content "C:\Temp\Test.xml"  
$Inhalt.SelectNodes(//Eintraege/SheetName)

$Count = 0

$Inhalt.Eintraege.SheetName | %{

if($_ -match "Umschlag"){  
 # wenn der SheetName "Umschlag" lautet passiert nichts 
}else{
 $_ = "Bogen" + $Count++  
}
}


Ausgabe vorher, wenn du dir die Nodes ausgeben lässt:

Test1
Umschlag
Test2


Ausgabe nachher, wenn du dir die Nodes ausgeben lässt:

Bogen0
Umschlag
Bogen1

VG
137443
Lösung 137443 02.11.2018 aktualisiert um 19:44:10 Uhr
Goto Top
$xml.SelectNodes('//default:Component[@SignatureName]',$ns) | %{  
    If ($_.Component.SheetName -ne "Bg_0"){  
        $_.Component.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"  
        $cnt++
    }
}
Usw. ...
Jensxx1975
Jensxx1975 05.11.2018 um 11:51:02 Uhr
Goto Top
Danke!

Jetzt jetzt stehe ich vor dem nächsten Problem:

Den Knoten Media gibt es 2x, auf der gleichen Ebene im XML (war mir vorher garnicht aufgefallen). D.h. der Counter zählt knotenübergreifend durch.

<Media Class="Consumable" HDM:RAWMEDIA="false" ID="r_181025_133021368_004167" MediaType="Paper" PartIDKeys="SignatureName SheetName" PartUsage="Implicit" Status="Unavailable">  
      <Media SignatureName="SIG001">  
        <Media Brand="Maxisatin" DescriptiveName="Maxisatin" Dimension="2494.48818898 1785.82677165" Grade="2" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="103-200-088063-01-5U" SheetName="Bg_0" Thickness="200" Weight="200" />  
      </Media>
      <Media SignatureName="SIG002">  
        <Media Brand="Maxisatin" DescriptiveName="Maxisatin" Dimension="2494.48818898 1785.82677165" Grade="2" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="R10-100-088-7" SheetName="Bogen_01" Thickness="100" Weight="100" />  
      </Media>
      <Media SignatureName="SIG003">  
        <Media Brand="Maxisatin" DescriptiveName="Maxisatin" Dimension="2494.48818898 1785.82677165" Grade="2" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="R10-100-088-7" SheetName="Bogen_02" Thickness="100" Weight="100" />  
      </Media>
      <Media SignatureName="SIG004">  
        <Media Brand="Maxisatin" DescriptiveName="Maxisatin" Dimension="2494.48818898 1785.82677165" Grade="2" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="R10-100-088-7" SheetName="Bogen_03" Thickness="100" Weight="100" />  
      </Media>
      <Media SignatureName="SIG005">  
        <Media Brand="Maxisatin" DescriptiveName="Maxisatin" Dimension="2494.48818898 1785.82677165" Grade="2" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="R10-100-088-7" SheetName="Bogen_04" Thickness="100" Weight="100" />  
      </Media>
      <Media SignatureName="SIG006">  
        <Media Brand="Maxisatin" DescriptiveName="Maxisatin" Dimension="2494.48818898 1785.82677165" Grade="2" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="R10-100-088-7" SheetName="Bogen_05" Thickness="100" Weight="100" />  
      </Media>
      <Media SignatureName="SIG007">  
        <Media Brand="Tauro-Offset" DescriptiveName="Tauro-Offset" Dimension="2494.48818898 1785.82677165" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="400-170-088063-01-6G" SheetName="Bogen_06" Thickness="0" Weight="170" />  
      </Media>
    </Media>
    <Media Class="Consumable" ID="r_181025_133021368_004168" MediaType="Plate" PartIDKeys="SignatureName SheetName" PartUsage="Implicit" Status="Unavailable">  
      <Media SignatureName="SIG001">  
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bg_0" />  
      </Media>
      <Media SignatureName="SIG002">  
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bogen_07" />  
      </Media>
      <Media SignatureName="SIG003">  
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bogen_08" />  
      </Media>
      <Media SignatureName="SIG004">  
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bogen_09" />  
      </Media>
      <Media SignatureName="SIG005">  
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bogen_10" />  
      </Media>
      <Media SignatureName="SIG006">  
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bogen_11" />  
      </Media>
      <Media SignatureName="SIG007">  
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bogen_12" />  
      </Media>
    </Media>

Ich müsste also im Konten
Media noch zusätzlich nach einem Attribut+Wert suchen.

So geht's leider nicht face-sad

    $cnt = 1

    $xml.SelectNodes('//default:Media@MediaType="Paper"[@SignatureName]',$ns) | %{  
    If ($_.Media.SheetName -ne "Bg_0"){  
        $_.Media.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"  
        $cnt++}}

    $cnt = 1

    $xml.SelectNodes('//default:Media@MediaType="Plate"[@SignatureName]',$ns) | %{  
    If ($_.Media.SheetName -ne "Bg_0"){  
        $_.Media.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"  
        $cnt++}}

Danke!

Gruß JENS
137443
137443 05.11.2018 aktualisiert um 12:21:59 Uhr
Goto Top
Zitat von @Jensxx1975:

Danke!
Stichwort xPath, das Tutorial dazu hatte ich dir gepostet. Lesen scheint nicht deine Stärke.
Jetzt jetzt stehe ich vor dem nächsten Problem:
Neue Frage neuer Thread, ist das so schwer?

P.s. Wie wärs erst mal mit mal Grundlagen aneignen? Dann musst du nicht jeden Furz erfragen.
Jensxx1975
Jensxx1975 05.11.2018 um 15:39:51 Uhr
Goto Top
Das Tutorial hatte ich gelesen, aber leider nicht die passende Antwort extrahieren können bzw. das was ich für die Lösung halte funktioniert nicht.

$xml.SelectNodes('//default:Media[attribute::MediaType = "Paper"][@SignatureName]',$ns)  

Bzgl. Grundlagen gebe ich Dir recht. Die habe ich aber zurzeit noch nicht in ausreichendem Maße, doch leider dieses kleine Projekt vor der Brust.

Naja, muss ich durch.

Trotzdem Dank bis hierhin...


Gruß JENS
137443
Lösung 137443 05.11.2018 aktualisiert um 15:44:20 Uhr
Goto Top
$xml.SelectNodes("//default:Media[@MediaType = 'Paper']",$ns)

siehe:
https://www.w3schools.com/xml/xpath_syntax.asp
//title[@lang='en'] Selects all the title elements that have a "lang" attribute with a value of "en"
Jensxx1975
Jensxx1975 05.11.2018 um 16:25:15 Uhr
Goto Top
...ist das
    $xml.SelectNodes("//default:Media[@MediaType = 'Plate']",$ns)  

zusätzlich oder ersetzend
$xml.SelectNodes('//default:Media[@SignatureName]',$ns)  

?
137443
Lösung 137443 05.11.2018 um 16:25:53 Uhr
Goto Top
Soweit solltest du selbst denken können.
Jensxx1975
Jensxx1975 05.11.2018 um 16:43:55 Uhr
Goto Top
face-smile

Es ist ja nicht so, dass ich nicht beide Varianten getestet hätte. Leider ohne passendes Ergebnis.

face-smile

Naja, mache erstmal was anderes - vielleicht habe ich ja morgen die Erleuchtung.
Jensxx1975
Jensxx1975 06.11.2018 um 14:05:57 Uhr
Goto Top
So, die Erleuchtung ist leider ausgelieben, aber so funktioniert es
    $cnt = 1

    $xml.SelectNodes("//default:Media[@MediaType = 'Paper']/default:Media[@SignatureName]",$ns) | %{  
    If ($_.SheetName -ne "Bg_0"){  
        $_.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"  
        $cnt++}}

    $cnt = 1

    $xml.SelectNodes("//default:Media[@MediaType = 'Plate']/default:Media[@SignatureName]",$ns) | %{  
    If ($_.SheetName -ne "Bg_0"){  
        $_.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"  
        $cnt++}}

Zumindest mit meinem Test-XML.

Leider erhalte ich trotzdem eine Fehlermeldung:
Ausnahme beim Festlegen von "SheetName": "Die Eigenschaft "SheetName" wurde für dieses Objekt nicht gefunden.
jeweils für diese Zeile:
 $_.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"  
Jensxx1975
Jensxx1975 06.11.2018 um 14:36:47 Uhr
Goto Top
So:

    $xml.SelectNodes("//default:Media[@MediaType = 'Plate']//default:Media[@SignatureName]",$ns) | %{  
    If ($_.Media.SheetName -ne "Bg_0"){  
        $_.Media.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"  
        $cnt++}}

Keine Fehlermeldung mehr.

DANKE!

Gruß Jens