Benutzer mit den meisten Antworten
XML gezielt auslesen

Frage
-
Hallo Forum,
Ich verstehe die Logik bei Powershell und XML einfach immer noch nicht so richtig :-(
wie muss ich es anstellen, dass ich aus dieser XML-Datei gezielt den Wert von <PROPERTY Name="Status" erhalte, bei dem z.B. der Wert <PROPERTY Name="enclosure-id"> = 2 und <PROPERTY Name="Slot"> = 2 ist????
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <RESPONSE VERSION="L100"> <COMP G="0" P="1"/> <OBJECT basetype="drives" name="drive" oid="1" format="rows"> <PROPERTY name="enclosure-id">1</PROPERTY> <PROPERTY name="slot">1</PROPERTY> <PROPERTY name="status">Up</PROPERTY> <PROPERTY name="health-numeric">0</PROPERTY> <PROPERTY name="health-reason"></PROPERTY> <PROPERTY name="led-status"> Online</PROPERTY> <PROPERTY name="led-status-numeric">1</PROPERTY> <PROPERTY name="disk-dsd-count">1</PROPERTY> </OBJECT> <COMP G="0" P="2"/> <OBJECT basetype="drives" name="drive" oid="2" format="rows"> <PROPERTY name="enclosure-id">1</PROPERTY> <PROPERTY name="slot">2</PROPERTY> <PROPERTY name="status">Up</PROPERTY> <PROPERTY name="health-numeric">0</PROPERTY> <PROPERTY name="health-reason"></PROPERTY> <PROPERTY name="led-status"></PROPERTY> <PROPERTY name="led-status-numeric">0</PROPERTY> <PROPERTY name="disk-dsd-count">1</PROPERTY> </OBJECT> <COMP G="0" P="3"/> <OBJECT basetype="drives" name="drive" oid="3" format="rows"> <PROPERTY name="enclosure-id">2</PROPERTY> <PROPERTY name="slot">1</PROPERTY> <PROPERTY name="status">Up</PROPERTY> <PROPERTY name="health-numeric">0</PROPERTY> <PROPERTY name="health-reason"></PROPERTY> <PROPERTY name="led-status"></PROPERTY> <PROPERTY name="led-status-numeric">0</PROPERTY> <PROPERTY name="disk-dsd-count">1</PROPERTY> </OBJECT> <COMP G="0" P="4"/> <OBJECT basetype="drives" name="drive" oid="4" format="rows"> <PROPERTY name="enclosure-id">2</PROPERTY> <PROPERTY name="slot">2</PROPERTY> <PROPERTY name="status">Down</PROPERTY> <PROPERTY name="health-numeric">0</PROPERTY> <PROPERTY name="health-reason"></PROPERTY> <PROPERTY name="led-status"></PROPERTY> <PROPERTY name="led-status-numeric">0</PROPERTY> <PROPERTY name="disk-dsd-count">1</PROPERTY> </OBJECT> </RESPONSE>
Für einen Tipp oder Hinweis in die richtige Richtung wäre ich wirklich sehr dankbar
Roland
- Bearbeitet Roland Gantenbein Donnerstag, 31. Januar 2013 08:13
Antworten
-
Hallo Roland,
das geht auch mit einer Zeile.
(Select-Xml -Path '.\New Text Document.txt' -XPath '//OBJECT[PROPERTY[@name = "slot"] = 2 and PROPERTY[@name = "enclosure-id"] = 2]/PROPERTY[@name = "status"]' | Select-Object -ExpandProperty node)."#text"
XPath bietet eine Menge Möglichkeiten, XML Daten abzufragen, wenn auch nicht ganz so intuitiv wie SQL.
Hätte man die Daten anders aufgebaut, wäre das alles etwas einfacher. Ich hätte nicht jedem Property über ein Attribut einen Namen gegeben sondern eher das Element gleich dem Namen benannt.
-Raimund
- Bearbeitet Raimund AndréeMicrosoft employee Freitag, 1. Februar 2013 14:52
- Als Antwort vorgeschlagen Peter Kriegel Montag, 4. Februar 2013 06:15
- Als Antwort markiert Roland Gantenbein Montag, 4. Februar 2013 07:36
-
Hallo Roland!
Als PowerShell Neuling mit XML zu beginnen ist, vorsichtig ausgedrückt, sehr ungünstig! ;-)
Man muss sich dazu in dem Umgang mit PowerShell Objekten gut auskennen, was sehr viele Grundlagen erfordert.
Man kann auch mit der XML Abfragesprache XPath arbeiten, die nicht sehr hilfreich ist.
Da du anscheinend noch nicht das objektorientierte Denken verinnerlicht hast, stellst du deine Frage Falsch!
Deine Frage müsst lauten:
Wie bekommen ich von allen Objekte (mit dem Namen OBJECT), den Wert des Feldes "Status",
bei denen die Properties enclosure-id > = 2 und Slot > = 2 sind.
Die Daten in dem XML Dokument sind sehr suboptimal verschachtelt, das erschwert die Sache zusätzlich!
Eine sehr harte Nuss!$XMLDoc = [XML](Get-Content 'C:\temp\test.xml')
# Alle OBJECT Knoten im Dokument durchlaufen ForEach($OBJECT in $XMLDoc.RESPONSE.OBJECT) { # Variablen für das Ergebnis der Bedingungsabfrage # Die Bedingungen sind hier natürlich noch $False $Bedingung1 = $False $Bedingung2 = $False # Alle PROPERTY Knoten die im OBJECT Knoten sind durchlaufen ForEach($PROPERTY in $OBJECT.PROPERTY) { # Wenn bei dem OBJECT Knoten der Status >= 2 ist, dann $Bedingung1 = $True IF(($PROPERTY.Name -eq 'slot') -and ($PROPERTY.'#text' -ge 2)) { $Bedingung1 = $True } # Wenn bei dem OBJECT Knoten die enclosure-id >= 2 ist, dann $Bedingung2 = $True IF(($PROPERTY.Name -eq 'enclosure-id') -and ($PROPERTY.'#text' -ge 2)) { $Bedingung2 = $True } # Auslesen des Wertes von dem PROPERTY mit dem Namen 'Status' IF($PROPERTY.Name -eq 'Status') { $Status = $PROPERTY.'#text' } } # Wenn bei dem OBJECT beide Bedingungen erfüllt sind, dann wird der Status angezeigt IF( $Bedingung1 -and $Bedingung2) { # Objekt ausgeben (der vollständigkeit halber) $OBJECT # Den vorher gesicherten Status von dem Objekt wo beide Bedingungen erfüllt sind ausgeben "Der Status ist: $Status" } }
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!
- Als Antwort vorgeschlagen Livio von Büren Freitag, 1. Februar 2013 10:09
- Bearbeitet Peter Kriegel Freitag, 1. Februar 2013 11:31 schreibfehler Korrigiert Version: 2393872362
- Als Antwort markiert Roland Gantenbein Montag, 4. Februar 2013 07:36
Alle Antworten
-
Hallo Roland!
Als PowerShell Neuling mit XML zu beginnen ist, vorsichtig ausgedrückt, sehr ungünstig! ;-)
Man muss sich dazu in dem Umgang mit PowerShell Objekten gut auskennen, was sehr viele Grundlagen erfordert.
Man kann auch mit der XML Abfragesprache XPath arbeiten, die nicht sehr hilfreich ist.
Da du anscheinend noch nicht das objektorientierte Denken verinnerlicht hast, stellst du deine Frage Falsch!
Deine Frage müsst lauten:
Wie bekommen ich von allen Objekte (mit dem Namen OBJECT), den Wert des Feldes "Status",
bei denen die Properties enclosure-id > = 2 und Slot > = 2 sind.
Die Daten in dem XML Dokument sind sehr suboptimal verschachtelt, das erschwert die Sache zusätzlich!
Eine sehr harte Nuss!$XMLDoc = [XML](Get-Content 'C:\temp\test.xml')
# Alle OBJECT Knoten im Dokument durchlaufen ForEach($OBJECT in $XMLDoc.RESPONSE.OBJECT) { # Variablen für das Ergebnis der Bedingungsabfrage # Die Bedingungen sind hier natürlich noch $False $Bedingung1 = $False $Bedingung2 = $False # Alle PROPERTY Knoten die im OBJECT Knoten sind durchlaufen ForEach($PROPERTY in $OBJECT.PROPERTY) { # Wenn bei dem OBJECT Knoten der Status >= 2 ist, dann $Bedingung1 = $True IF(($PROPERTY.Name -eq 'slot') -and ($PROPERTY.'#text' -ge 2)) { $Bedingung1 = $True } # Wenn bei dem OBJECT Knoten die enclosure-id >= 2 ist, dann $Bedingung2 = $True IF(($PROPERTY.Name -eq 'enclosure-id') -and ($PROPERTY.'#text' -ge 2)) { $Bedingung2 = $True } # Auslesen des Wertes von dem PROPERTY mit dem Namen 'Status' IF($PROPERTY.Name -eq 'Status') { $Status = $PROPERTY.'#text' } } # Wenn bei dem OBJECT beide Bedingungen erfüllt sind, dann wird der Status angezeigt IF( $Bedingung1 -and $Bedingung2) { # Objekt ausgeben (der vollständigkeit halber) $OBJECT # Den vorher gesicherten Status von dem Objekt wo beide Bedingungen erfüllt sind ausgeben "Der Status ist: $Status" } }
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!
- Als Antwort vorgeschlagen Livio von Büren Freitag, 1. Februar 2013 10:09
- Bearbeitet Peter Kriegel Freitag, 1. Februar 2013 11:31 schreibfehler Korrigiert Version: 2393872362
- Als Antwort markiert Roland Gantenbein Montag, 4. Februar 2013 07:36
-
Der hier wollte bei mir einfach nichts ausgeben, aber ich habe es irgendwie einfach nicht kapiert.
$PROPERTY.'#text'
Mein Script, mit dem ich das austesten wollte, war natürlich nicht ganz gleich aufgestellt, aber der Sinn war derselbe. Ich hatte wohl sonst irgendwo noch eine kleine Macke, die mir nicht aufgefallen ist.
Na immerhin funktionieren Peter's Scripts. :)
The following is my signature:Powershell Programmer & Advanced Lua Programmer
Location: Switzerland
Beside that, whenever you see a reply, you think is helpful, click "
Vote As Helpful"! And whenever you see a reply being an answer to the main question of the thread, click "
Mark As Answer" (if you opened the thread).
I published the URL's for the icons in my signature.
Please contact me, before reporting me, thank you.
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('577076797174-87661607769657424-8687168065964').substring(($_*2),2))})-replace' '
-
Ja! Das mit dem #Text ist für die PowerShell doppelter Mist ;-))
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum! -
Hallo Roland,
das geht auch mit einer Zeile.
(Select-Xml -Path '.\New Text Document.txt' -XPath '//OBJECT[PROPERTY[@name = "slot"] = 2 and PROPERTY[@name = "enclosure-id"] = 2]/PROPERTY[@name = "status"]' | Select-Object -ExpandProperty node)."#text"
XPath bietet eine Menge Möglichkeiten, XML Daten abzufragen, wenn auch nicht ganz so intuitiv wie SQL.
Hätte man die Daten anders aufgebaut, wäre das alles etwas einfacher. Ich hätte nicht jedem Property über ein Attribut einen Namen gegeben sondern eher das Element gleich dem Namen benannt.
-Raimund
- Bearbeitet Raimund AndréeMicrosoft employee Freitag, 1. Februar 2013 14:52
- Als Antwort vorgeschlagen Peter Kriegel Montag, 4. Februar 2013 06:15
- Als Antwort markiert Roland Gantenbein Montag, 4. Februar 2013 07:36
-
Tja, XML ist nicht unbeding mein Fachgebiet, aber die XPath anleitungen die ich im Internet gefunden habe sind nicht besonders gut....
http://www.im-web-gefunden.de/2007/08/30/xpath-tutorials/[Edit ] Der Wikipedia Artikel in verbindung mit dem deutschen Tutorial ist gabz gut!
http://de.wikipedia.org/wiki/XPath
http://www.data2type.de/xml-xslt-xslfo/xpath/xpath-einfuehrung/
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!
- Bearbeitet Peter Kriegel Samstag, 2. Februar 2013 13:53
-
Roland ist deine Frage damit beantwortet? Dann markiere bitte die richtige(n) Antworte(n). Danke!
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".- Bearbeitet Denniver ReiningMVP, Moderator Sonntag, 3. Februar 2013 13:52
-
Hallo zusammen,
Herzlichen Dank an Peter und Raimund.
Sorry, das ich mich erst jetzt wieder melde. War über's Wochenende fort.
Eure Lösungen funktionieren beide super. Musste beide Ansätze erst einmal in Ruhe verdauen, aber ich hab's dann verstanden.
Der Einzeiler in diesem Fall ist mein bevorzugter Favorit :-)
Nochmals recht herzlichen Dank für Eure Bemühungen.
Grüsse aus der Schweiz
Roland