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-Key: 391494

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

Printed on: April 26, 2024 at 13:04 o'clock

Member: H41mSh1C0R
H41mSh1C0R Nov 02, 2018 at 12:22:06 (UTC)
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
Member: Jensxx1975
Jensxx1975 Nov 02, 2018 at 13:52:29 (UTC)
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
Member: H41mSh1C0R
Solution H41mSh1C0R Nov 02, 2018 at 15:13:01 (UTC)
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
Mitglied: 137443
Solution 137443 Nov 02, 2018 updated at 18:44:10 (UTC)
Goto Top
$xml.SelectNodes('//default:Component[@SignatureName]',$ns) | %{  
    If ($_.Component.SheetName -ne "Bg_0"){  
        $_.Component.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"  
        $cnt++
    }
}
Usw. ...
Member: Jensxx1975
Jensxx1975 Nov 05, 2018 at 10:51:02 (UTC)
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
Mitglied: 137443
137443 Nov 05, 2018 updated at 11:21:59 (UTC)
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.
Member: Jensxx1975
Jensxx1975 Nov 05, 2018 at 14:39:51 (UTC)
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
Mitglied: 137443
Solution 137443 Nov 05, 2018 updated at 14:44:20 (UTC)
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"
Member: Jensxx1975
Jensxx1975 Nov 05, 2018 at 15:25:15 (UTC)
Goto Top
...ist das
    $xml.SelectNodes("//default:Media[@MediaType = 'Plate']",$ns)  

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

?
Mitglied: 137443
Solution 137443 Nov 05, 2018 at 15:25:53 (UTC)
Goto Top
Soweit solltest du selbst denken können.
Member: Jensxx1975
Jensxx1975 Nov 05, 2018 at 15:43:55 (UTC)
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.
Member: Jensxx1975
Jensxx1975 Nov 06, 2018 at 13:05:57 (UTC)
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'))"  
Member: Jensxx1975
Jensxx1975 Nov 06, 2018 at 13:36:47 (UTC)
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