Powershell XML.SelectNodes findet nichts

Mitglied: SPSman
Hi,

Ich bekomme aus einem Programm eine XML die ich gerne erweitern möchte. Undzwar möchte ich '<Symbol>' kopieren und dabei die <Component> OPN_SOLL mit V15_SOLL ersetzen.

Wenn ich jetzt jedoch '$sourceNode = $XMLContend.SelectNodes("//Parts")' ausführe ist $sourceNode.Count "0".

Wie kann ich auf 'Parts' Zugreifen und das Objekt Component kopieren/adressieren

Powershell:

XML:
opn_xml

Danke.

Content-Key: 1302715031

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

Ausgedruckt am: 19.10.2021 um 23:10 Uhr

Mitglied: hacktor
hacktor 26.09.2021 aktualisiert um 10:19:03 Uhr
Goto Top
XMLContend
Dazu sag ich jetzt mal nichts :-D face-big-smile.

1. Von deiner XML sieht man leider nur die Hälfte und dann auch noch als Bild?? Warum kein richtiger Text?. Bei SelectNodes ist es aber essentiell wichtig wenn Namespaces vorhanden sind, und die kann man hier leider nicht erkennen wenn man nur die Hälfte da von sieht. Bei Namespaces muss man einen Namespace-Manger erstellen und diesem den Namespace in dem sich der Knoten befindet deklarieren. Alternativ nimmt man sich statt SelectNodes zu verwenden den Baum der Powershell Objekte her und itteriert darüber bsp.
2. Das "Parts" scheint hier selber "reingeflickt" worden zu sein, denn die Elemente sind nicht in der richtigen Reihenfolge mit EndTags versehen, ungültiges XML bringt das dann ebenfalls zu Fall.

Danke.
Bitte.
Mitglied: colinardo
Lösung colinardo 26.09.2021 aktualisiert um 20:38:54 Uhr
Goto Top
Servus @SPSman,
@hacktor hat schon einen wichtigen Hinweis gegeben. Wenn das XML-File Namespaces enthält muss man auch via Namespace-Prefix in der SelectNodes Methode arbeiten und einen Namespacemanager angeben in dem die Namespaces und dessen Prefixe enthalten sind.
Und wenn man genau auf das Bild schaut sieht man auch das es Namespaces enthält @hacktor, zwar nicht den Namespace an sich aber das xmlns reicht dann schon das zu behaupten ;-) face-wink.

screenshot

Hier mal ein Beispiel-XML File das eine dem Parts-Knoten übergeordnete Namespace Deklaration in dem Knoten
enthält:


Darauf aubauend nun ein Skript das die Namespaces via Namespace-Manager bekannt macht und dann diesen in der SelectNodes Methode nutzt.:
Bei der folgenden Methode extrahiere ich alle enthaltenen Namespaces automatisch, du kannst diese aber auch manuell dem NamespaceManger hinzufügen via

Das Ergebnis des Codes macht aus dem Abschnitt:
dann diesen (du wolltest ja kopieren und dabei anpassen und nicht nur ersetzen, so jedenfalls habe ich deinen Text interpretiert)
Willst du stattdessen den Knoten nur ändern und nicht kopieren dann reicht es den Code der Schleife oben so abzuändern
Ergebnis ist dann...

Hier auch noch etwas Lektüre zum nachlesen
https://www.windowspro.de/script/xml-powershell-xpath-abfragen-namespace ...

Grüße Uwe
Mitglied: SPSman
SPSman 26.09.2021 um 20:09:50 Uhr
Goto Top
Hi,
hier mal die komplett XML:


mit dem Thema Namespaces habe ich mich noch nicht beschäftigt. Werde ich wohl noch müssen. Das "Parts" ist jedoch nicht "hineingefirmelt" sondern genau so aus dem Siemens Programm gekommen ;)

VG Rob
Mitglied: hacktor
hacktor 26.09.2021 aktualisiert um 20:49:46 Uhr
Goto Top
Zitat von @SPSman:


mit dem Thema Namespaces habe ich mich noch nicht beschäftigt. Werde ich wohl noch müssen. Das "Parts" ist jedoch nicht "hineingefirmelt" sondern genau so aus dem Siemens Programm gekommen ;)

VG Rob

Na dann hat @colinardo es dir ja schon auf den Silbertablett serviert.
Mitglied: SPSman
SPSman 27.09.2021 aktualisiert um 14:44:08 Uhr
Goto Top
Zitat von @colinardo:

Servus @SPSman,
Grüße Uwe

Hallo Uwe,

ich habe dein Script mal ausprobiert und es passt nachtürlich super zu meiner Aufgabenstellung.
Ich versuche ja immer ein einfaches Beispiel zu nehmen, das zu verstehen und dann komplexere Aufgagen zu erledigen...


Tja jetzt habe ich versuch dein Script anzupassen und es kommt nur murcks :S.


Mein Script:


Ausgabe:
PS C:\Mailbox\01_Projekte\Roskow\OPN_2> C:\Mailbox\01_Projekte\Roskow\FC_erweitern.ps1
Ausnahme beim Aufrufen von "SelectSingleNode" mit 2 Argument(en): "' ;default:'SW.Blocks.CompileUnit'' > hat einen ungültig gekennzeichneten Namen."
In C:\Mailbox\01_Projekte\Roskow\FC_erweitern.ps1:12 Zeichen:1
+$nodes = $xml.SelectSingleNode("
default:'SW.Blocks.CompileUnit'",$n ...
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) face-smile [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException

2
0
1
2

Er hat trotz "SelectsingleNote" 2 objekte. Warum?
Und was für ein Problem er mit der Fehlermeldung meint ist mit auch noch Schleierhaft.

Die Gesamte Aufgabenstellung ist eigentlich erste SW.Blocks.CompileUnit kopieren, ID durch Laufvariable ergänzen und Textelement, OPN , ANLAGE , NW_KOMMENTAR durch die Entsprechenden Arraystrings ersetzen. (Als es wird 3 Arrays mit den entsprechenden Ersatzstrings geben.)


Zu verändernde Stellen(Zeile 1,8,6,46):

Mitglied: colinardo
colinardo 27.09.2021 aktualisiert um 15:38:08 Uhr
Goto Top
Zitat von @SPSman:
Und was für ein Problem er mit der Fehlermeldung meint ist mit auch noch Schleierhaft.
1. Du setzt den Knotennamen in der XPath Query in Hochkommas, das ist falsch, das brauchst du hier verwechselst hier Powershell mit XPath Syntax.

2. Bei dem Knoten "SW.Blocks.CompileUnit" brauchst du keinen Namespacemanager, da dieser Knoten nicht unterhalb der Baumstruktur liegt welcher den Namespace definiert! Für die XPath Abfrage brauchen wir also den Namespacemanger nur wenn wir Knoten selektieren wollen die in einer Namespace definition, das ist bei deiner Aufgabenstellung nur für den Component Knoten mit dem Attribute Name="OPN_SOLL" der Fall.

screenshot


Er hat trotz "SelectsingleNote" 2 objekte. Warum?
3. Das du noch 2 Objekte in der Variablen hast liegt daran das du diese wohl in der ISE vorher mal gefüllt hast und diese immer noch alten Inhalt ausgibt.

Dein Vorhaben sieht dann so aus (eine Stelle die du definiert hast finde ich zwar nicht aber das solltest du dann selber sehen). In die Werte habe ich nur durch Demo-Text gesetzt, das kannst du dann durch den Inhalt deiner Array-Werte ersetzen.


Alternativ kannst du Knoten auch wenn die Position im Baum fest ist auch ohne XPath Selection ansprechen, bspw. für die Variable $node in obigem Skript sähe das dann so aus um den ersten 'SW.Blocks.CompileUnit' Knoten zu bekommen
das ist aber nur zuverlässig wenn du 100% sagen kannst das dieser Knoten immer an genau dieser Baumstruktur platziert ist.

Grüße Uwe
Mitglied: SPSman
SPSman 28.09.2021 um 09:44:28 Uhr
Goto Top
Hallo Uwe,

erstmal vielen Dank für dein Script.

Ich habe es erweitert, aber natürlich funktionieren viele Sagen noch nicht.

" <Component Name="OPN" />" wird nicht angepasst bzw. selectnodes läuft mal wieder ins leere..

Dann muss der Bereich hinter SW.Blocks.CompileUnitauch wieder dahinter eingefügt werden

Und ALLE "ID"(nicht Uid) Atribute müssen verändert werden.

Ich hab sowas zwar schonmal mit VBS und Suchen/ersetzen gebaut, allerdings will ich ja gerade XML lernen.

Es sollen alle Attribute die "OPN*" im Namen enthalten durch eine String Variable ersetzt werden.
Ebenfalls sollen auch alle IDs mittels Laufvariable verändert werden. (das geht vermutlich gut mit Getattribute und Setattribute)

Wie kann ich alle Nodes im $NewNode die den String "OPN"(also Sowohl "OPN" als auch "OPN_Soll" oder "OPN bla") adressieren?
Wie Kann ich alle Nodes im $NewNode die eine "ID" haben heraussuchen?
Wieso $Temp_Kommentar nicht geschrieben?


Aktuelle Stand:

Mitglied: colinardo
colinardo 28.09.2021 aktualisiert um 11:18:46 Uhr
Goto Top
Servus again.
Zitat von @SPSman:
" <Component Name="OPN" />" wird nicht angepasst bzw. selectnodes läuft mal wieder ins leere..
War ja auch keine Anforderung deinerseits oben, da war die Rede von "OPN_SOLL".

Dann muss der Bereich hinter SW.Blocks.CompileUnitauch wieder dahinter eingefügt werden
Macht mein Skript mit deinem oben geposteten XML einwandfrei.

Und ALLE "ID"(nicht Uid) Atribute müssen verändert werden.

Kannst du leicht addressieren

Es sollen alle Attribute die "OPN*" im Namen enthalten durch eine String Variable ersetzt werden.
Wie kann ich alle Nodes im $NewNode die den String "OPN"(also Sowohl "OPN" als auch "OPN_Soll" oder "OPN bla") adressieren?
Select sieht dann so aus

Wie Kann ich alle Nodes im $NewNode die eine "ID" haben heraussuchen?
s. oben.
Wieso $Temp_Kommentar nicht geschrieben?
Tippfehler der Variable $Temp_Komentar statt $Temp_Kommentar


Man sollte vorher nochmal Korrektur lesen, erneuter Tippfehler ... Compnent

Ich bin jetzt raus. Da kommt man sich hier doch ehrlich gesagt langsam aber sicher veralbert vor wenn man hier alles schnell mal einkippt bevor man es überhaupt Korrektur gelesen hat ... :-( face-sad.

Bitte lies dir zur XPATH-Selections Syntax die einschlägigen Dokumentationen durch und übe damit sonst lernst du aus dem ganzen hier nichts.
https://www.w3schools.com/xml/xpath_syntax.asp

Und vor allem, mehr Präzision an den Tag legen!

Viel Erfolg.

Grüße Uwe

p.s. Das ursprüngliche Problem dieses Threads wurde gelöst, alles andere ist jetzt Off-Topic und kannst du dir gerne per PN von mir ein Angebot für weitere Arbeiten einholen!
Den Beitrag also bitte noch auf gelöst setzen, und Lösungen markieren. Merci.
Mitglied: C.Caveman
C.Caveman 28.09.2021 um 10:47:38 Uhr
Goto Top
Zitat von @colinardo:
...
Ich bin jetzt raus. Da kommt man sich hier doch ehrlich gesagt langsam aber sicher veralbert vor wenn man hier alles schnell mal einkippt bevor man es überhaupt Korrektur gelesen hat ... :-( face-sad.

Das Problem, kann man mit Python lösen.
Monty Python :-D face-big-smile

Mitglied: SPSman
SPSman 28.09.2021 aktualisiert um 12:42:12 Uhr
Goto Top
Zitat von @colinardo:

Servus again.
Zitat von @SPSman:
" <Component Name="OPN" />" wird nicht angepasst bzw. selectnodes läuft mal wieder ins leere..
War ja auch keine Anforderung deinerseits oben, da war die Rede von "OPN_SOLL".
Das ist nicht Korrekt. Oben schrieb ich Zeile 8 und Zeile 16 soll verändert werden. (OPN_SOLL und OPN)



Dann muss der Bereich hinter SW.Blocks.CompileUnitauch wieder dahinter eingefügt werden
Macht mein Skript mit deinem oben geposteten XML einwandfrei.
-> Leider nicht da MultilingualText auf der Gleichen ebene wie SW.Blocks.CompileUnit werden die neuen SW.Blocks.CompileUnit Objekte hinten angehängt

Und ALLE "ID"(nicht Uid) Atribute müssen verändert werden.
Habe ich Gestern erst herausgefunden.


Kannst du leicht addressieren
Danke, Test folgt.
Es sollen alle Attribute die "OPN*" im Namen enthalten durch eine String Variable ersetzt werden.
Wie kann ich alle Nodes im $NewNode die den String "OPN"(also Sowohl "OPN" als auch "OPN_Soll" oder "OPN bla") adressieren?
Select sieht dann so aus
Danke, Test folgt.

Wieso $Temp_Kommentar nicht geschrieben?
Tippfehler der Variable $Temp_Komentar statt $Temp_Kommentar
Oh man, ja das hätte mir auch auffallen sollen!
Man sollte vorher nochmal Korrektur lesen, erneuter Tippfehler ... Compnent
Danke. Nehme Ich mir zu Herzen
Ich bin jetzt raus. Da kommt man sich hier doch ehrlich gesagt langsam aber sicher veralbert vor wenn man hier alles schnell mal einkippt bevor man es überhaupt Korrektur gelesen hat ... :-( face-sad.

Das tut mir leid, es war keine Absicht.


Bitte lies dir zur XPATH-Selections Syntax die einschlägigen Dokumentationen durch und übe damit sonst lernst du aus dem ganzen hier nichts.
https://www.w3schools.com/xml/xpath_syntax.asp
Danke für den Link! Über sowas bin ich immer Froh, da man ja Off keine Stelle hat wo man beginnen soll.

Grüße Uwe

p.s. Das ursprüngliche Problem dieses Threads wurde gelöst, alles andere ist jetzt Off-Topic.

Ja ist gelöst.
Ich probiere weiter.
Mitglied: hacktor
hacktor 28.09.2021 aktualisiert um 13:23:25 Uhr
Goto Top
Zitat von @SPSman:
Das ist nicht Korrekt. Oben schrieb ich Zeile 8 und Zeile 16 soll verändert werden. (OPN_SOLL und OPN)

Da grätsch ich doch mal dazwischen ... hast du oben bei der 16 wohl ne 1 vergessen. In Zeile 6 findet man da nix mit "OPN" :-P.
:

Zitat von @SPSman:
Zu verändernde Stellen(Zeile 1,8,6,46):

Vielleicht solltest du beim Tippen mal die Fäustlinge ausziehen 🙈 .
Mitglied: SPSman
SPSman 28.09.2021 um 15:05:39 Uhr
Goto Top
Zitat von @hacktor:

Zitat von @SPSman:
Das ist nicht Korrekt. Oben schrieb ich Zeile 8 und Zeile 16 soll verändert werden. (OPN_SOLL und OPN)

Da grätsch ich doch mal dazwischen ... hast du oben bei der 16 wohl ne 1 vergessen. In Zeile 6 findet man da nix mit "OPN" :-P.
:

Zitat von @SPSman:
Zu verändernde Stellen(Zeile 1,8,6,46):

Vielleicht solltest du beim Tippen mal die Fäustlinge ausziehen 🙈 .

Meinst du das hilft? :O
Mitglied: hacktor
hacktor 28.09.2021 aktualisiert um 15:14:28 Uhr
Goto Top
Zitat von @SPSman:
Meinst du das hilft? :O
Wer weiß das schon, wenn deine Tasten 10x10cm groß sind dann wahrscheinlich nicht, außer du hast kein Zielwasser getrunken :-D face-big-smile
Mitglied: SPSman
Lösung SPSman 30.09.2021, aktualisiert am 01.10.2021 um 21:06:02 Uhr
Goto Top
Hi Mein Endgültiges Script falls jemand hier liest:

Heiß diskutierte Beiträge
question
Windows 11 Upgrade nicht möglichben1300Vor 1 TagFrageWindows 1114 Kommentare

Guten Morgen ! ich habe einen Gaming PC, mit folgende Spezifikationen: Leider kann ich diesen nicht auf Windows 11 upgraden: Welche Optionen bleiben mir, um ...

question
Was ich benötige ist ein guter Wechselrahmen 5,25"Lefty0815Vor 1 TagFrageFestplatten, SSD, Raid8 Kommentare

Hallo an alle, ich such mir noch einen Wolf :-) Was ich benötige ist ein Wechselrahmen 5,25" für eine zwei oder drei 3,5Zoll Festplatten (SATA ...

question
Exchange Server - Wege, anonymes Senden zu verbietenDerWoWussteVor 1 TagFrageExchange Server11 Kommentare

Ich grüße Euch! Ziel 1: Alle PCs sollen Warnmeldungen per E-Mail geskriptet und anonym versenden können. In diesen Skripten handelt das Computerkonto und im Skript ...

question
Neuinstallation NetzwerkBurQueVor 13 StundenFrageNetzwerkgrundlagen13 Kommentare

Hallo ich hab die Aufgabe bekommen ein Netzwerk in einem neuen Gebäude einzurichten bzw. mir dazu Gedanken zu machen. Raumsituation. Im Keller steht ein Serverschrank ...

question
WLAN Lösung für Gästehaus Vereinjohannes-meyerVor 22 StundenFrageLAN, WAN, Wireless8 Kommentare

Hallo, ich betreue die IT eines Vereins, der zwei Gebäude mit Gästebetrieb betreibt. Es sind regelmäßig an die 30 bis 50 Geräte verbunden. Ich hab ...

question
SMTP Relay Server gelöst MacLeodVor 1 TagFrageExchange Server10 Kommentare

Hallo zusammen. Vorwort: Habe das hier bei Exchange eingeteilt, betrifft aber Mailserver Versand allgemein. Bei einem Kunden mit einem Kerio Mailserver werden neben dem üblichen ...

question
Multi-WAN-Netzwerk fürs StudentenwohnheimHutzeljaegerVor 7 StundenFrageLAN, WAN, Wireless17 Kommentare

Hallo allerseits. Für die Internetversorgung unseres Studentenwohnheims muss ich nun sehen, dass ich eine kostengünstige Lösung eines Multi-WAN Netzwerks hinbekomme, wohl am besten per Multi-WAN-Bonding. ...

question
Drei Fragen zum Internet Explorer gelöst UserUWVor 22 StundenFrageWebbrowser4 Kommentare

1) Der IE lässt sich unter Windows 10 deaktivieren, aber nicht physisch deinstallieren. Heißt das, dass IE-Funktionalitäten "unter der Haube" auch von Windows 10 genutzt ...