[Powershell]Specifiek xml veld zoeken en data uit tree halen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 09:35
Mijn vraag
Ik heb onderstaande XML structuur. Helaas loop ik vast bij het zoeken van een veld als deze meerdere keren voorkomt. Specifieke waardes lukken mij wel maar dit dus niet.
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="/admin/gui.xsl"?>
<basic>
<parameterPage name="netstart" description="Network">
  <configParameter name="requirenetwork" description="Require network connection">
    <par_enum name="requirenetwork">
      <par_enum_option_selected VALUE="1">Yes</par_enum_option_selected>
      <par_enum_option VALUE="0">No</par_enum_option>
    </par_enum>
    <par_retrieve name="requirenetwork" default="1" last="1"/>
  </configParameter>
  <configParameter name="dhcp" description="DHCP">
    <par_enum name="dhcp">
      <par_enum_option VALUE="1">Enabled</par_enum_option>
      <par_enum_option_selected VALUE="0">Disabled</par_enum_option_selected>
    </par_enum>
    <par_retrieve name="dhcp" default="0" last="0"/>
  </configParameter>
  <configParameter name="ipaddress" description="IP address">
    <par_string name="ipaddress">10.30.168.51</par_string>
    <par_retrieve name="ipaddress" default="0.0.0.0" last="10.30.168.51"/>
  </configParameter>
</basic>

Relevante software en hardware die ik gebruik
Powershell 4.0

Wat ik al gevonden of geprobeerd heb
Met deze code krijg ik prima velden in mijn vars, maar helaas gaat dat niet op bij de xml structuur welke ik nu heb.
code:
1
2
3
4
[xml]$XmlDocument = Get-Content "$mapnaam\temp.xml"
    $global:IP = $XmlDocument.info.addr 
    $global:subnet = $XmlDocument.info.mask
    $global:gateway = $XmlDocument.info.gw


Wat ik dus graag wil doen is, bij configparameter dhcp de waarde disabled van onderliggende par_enum_option_selected ophalen.
Dit heb ik geprobeerd met de onderstaande code maar dat werkt helaas niet :|
code:
1
2
$DeNode = ($XmlDocument.basic.parameterPage.configParameter | Where $_.name -eq "dhcp")
    $global:DHCP = $DeNode.par_enum.par_enum_option_selected


De gehele xml is z'n 800 regels en er zijn nog veel meer configParameter regels met par_enum_option_selected & par_string elementen. Maar elke configParameter heeft wel een unieke name attribute

Ik krijg de volgende error:
code:
1
2
3
4
5
Where-Object : Cannot validate argument on parameter 'Property'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again.
+ ... lDocument.basic.parameterPage.configParameter | Where $_.name -eq "dh ...
+                                                           ~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Where-Object], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.WhereObjectCommand

[ Voor 11% gewijzigd door The-Source op 07-08-2019 09:20 . Reden: toevoeging error code ]

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal

Beste antwoord (via The-Source op 07-08-2019 11:27)


  • itons
  • Registratie: Oktober 2003
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
[xml]$XmlDocument = Get-Content "lol.xml"
    $IP = $XmlDocument.info.addr 
    $subnet = $XmlDocument.info.mask
    $gateway = $XmlDocument.info.gw

#    Write-Host ($XmlDocument.basic.parameterPage | Format-Table | Out-String)

    $DeNode = ($XmlDocument.basic.parameterPage.configParameter | Where-Object {$_.name -eq "dhcp"})

    Write-Host ($DeNode.par_enum.par_enum_option_selected."#text" | Format-Table | Out-String)

Alle reacties


Acties:
  • +1 Henk 'm!

  • RedFox
  • Registratie: November 2001
  • Laatst online: 18:52

RedFox

Heb je een OV ofzo?

Als je alleen de waarde van par_enum_option_selected nodig hebt kan je ook XPath gebruiken:

PowerShell:
1
2
[xml]$Document = Get-Content .\test.xml
$Document.SelectNodes("//configParameter[@name='dhcp']/par_enum/par_enum_option_selected")

(Getest in PS 5)

[ Voor 3% gewijzigd door RedFox op 07-08-2019 09:34 ]

You are not special. You are not a beautiful or unique snowflake. You're the same decaying organic matter as everything else.


Acties:
  • 0 Henk 'm!

  • itons
  • Registratie: Oktober 2003
  • Niet online
code:
1
$DeNode = ($XmlDocument.basic.parameterPage.configParameter | Where-Object {$_.name -eq "dhcp"})

Acties:
  • 0 Henk 'm!

  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 09:35
RedFox schreef op woensdag 7 augustus 2019 @ 09:33:
Als je alleen de waarde van par_enum_option_selected nodig hebt kan je ook XPath gebruiken:

PowerShell:
1
2
[xml]$Document = Get-Content .\test.xml
$Document.SelectNodes("//configParameter[@name='dhcp']/par_enum/par_enum_option_selected")

(Getest in PS 5)
Ik heb Powershell 5 (windows 10) maar code werkt ook in powershell 4
De code geeft geen output.. Heb ook nog met //basic/configParameter getest maar helaas ook geen succes.
itons schreef op woensdag 7 augustus 2019 @ 09:41:
code:
1
$DeNode = ($XmlDocument.basic.parameterPage.configParameter | Where-Object {$_.name -eq "dhcp"})
Ook getest met jouw code, krijg nu geen foutmelding meer maar helaas nog geen waarde in mijn $global.DHCP var.

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

The-Source schreef op woensdag 7 augustus 2019 @ 09:49:
[...]

Ik heb Powershell 5 (windows 10) maar code werkt ook in powershell 4
De code geeft geen output.. Heb ook nog met //basic/configParameter getest maar helaas ook geen succes.


[...]

Ook getest met jouw code, krijg nu geen foutmelding meer maar helaas nog geen waarde in mijn $global.DHCP var.
Waarschijnlijk heb je dan zelf iets fout gedaan. Het stukje XML wat je hebt gepost klopt ook niet. Het parameterPage element wordt niet gesloten.

Acties:
  • 0 Henk 'm!

  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 09:35
downtime schreef op woensdag 7 augustus 2019 @ 09:53:
[...]

Waarschijnlijk heb je dan zelf iets fout gedaan. Het stukje XML wat je hebt gepost klopt ook niet. Het parameterPage element wordt niet gesloten.
Dat komt omdat de code ingekort heb geplakt maar het element wordt wel gesloten in de complete xml, voor de zekerheid nog even gecontroleerd.

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal


Acties:
  • 0 Henk 'm!

  • RedFox
  • Registratie: November 2001
  • Laatst online: 18:52

RedFox

Heb je een OV ofzo?

Met welk document ben je aan het testen? Als ik test met het stukje wat je hier hebt gepost (met afgesloten parameterPage) krijg ik met de XPath het volgende als output:

code:
1
2
3
VALUE #text
----- -----
0     Disabled

You are not special. You are not a beautiful or unique snowflake. You're the same decaying organic matter as everything else.


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • itons
  • Registratie: Oktober 2003
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
[xml]$XmlDocument = Get-Content "lol.xml"
    $IP = $XmlDocument.info.addr 
    $subnet = $XmlDocument.info.mask
    $gateway = $XmlDocument.info.gw

#    Write-Host ($XmlDocument.basic.parameterPage | Format-Table | Out-String)

    $DeNode = ($XmlDocument.basic.parameterPage.configParameter | Where-Object {$_.name -eq "dhcp"})

    Write-Host ($DeNode.par_enum.par_enum_option_selected."#text" | Format-Table | Out-String)

Acties:
  • 0 Henk 'm!

  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 09:35
Het geselecteerde antwoord werkt. Ik zie dat er nu ."#text" erbij staat en eerdere test optie had ik die niet staan. Met deze code kan ik weer vooruit :)

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal

Pagina: 1