Reputation: 892
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
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