Cheries
Cheries

Reputation: 892

How to get element of XML using PowerShell?

I have an XML file like this

<Data>
     <family no="1309" description="date">
               <desc name="rt1" code="10.010" />
               <desc name="rt2" code="10.9" />
               <desc name="b2" code="17.4" />
               <desc name="E1" code="12.15" />
               <desc name="n3" code="2.7.1" />
     </family>
     <family no="2006" description="date">
               <desc name="rt3" code="16450.010" />
               <desc name="rt5" code="165460.9" />
               <desc name="b7" code="1736577.4" />
               <desc name="E8" code="175632.15" />
               <desc name="n0" code="2735.7.1" />
     </family>
</Data>

I would like to get the value of code with desc name=rt1. I tried this but, it always empty.

$Def = $Read.Data.family | Where-Object {$_.no -eq "1309"} | Select-Object -ExpandProperty desc |
          Select-Object -ExpandProperty code | Where-Object {$_.name -eq "rt1"} | Select-Object -ExpandProperty code
          Write-Host "Def: $Def"

Anyone can help me please, thank you

Upvotes: 1

Views: 467

Answers (1)

JPBlanc
JPBlanc

Reputation: 72660

You can use XPath to retrieve nodes whith an attribute value using xPath and then retreive another attribute:

$a = @"
<Data>
     <family no="1309" description="date">
               <desc name="rt1" code="10.010" />
               <desc name="rt2" code="10.9" />
               <desc name="b2" code="17.4" />
               <desc name="E1" code="12.15" />
               <desc name="n3" code="2.7.1" />
     </family>
     <family no="2006" description="date">
               <desc name="rt3" code="16450.010" />
               <desc name="rt5" code="165460.9" />
               <desc name="b7" code="1736577.4" />
               <desc name="E8" code="175632.15" />
               <desc name="n0" code="2735.7.1" />
     </family>
</Data>
"@
# Load XML as xml document
$b = [xml]$a
# Use Xpath to seatch the name
$c = Select-Xml -Xml $b -XPath "//Data/family/desc[@name='rt1']"
# Show the code
$c.Node.Attributes['code'].'#text'

You can add a var and do it shorter :

$name = "rt1"
( Select-Xml -Xml $b -XPath "//*/desc[@name='$name']").Node.code 

Upvotes: 1

Related Questions