[英]Powershell script to search an XML sub-elements
您好,我在嘗試從 XML 獲取具有特定名稱的一個節點的值時遇到問題。
例如:
<Smart>
<Settings>
<Service name="9003">
<Config imports="router">
<Section name="x">
<Parameter name="a" value="0" />
<Parameter name="b" value="1" />
<Parameter name="c" value="2" />
<Parameter name="d" value="3" />
<Parameter name="e" value="4" />
</Section>
</Config>
</Service>
<Service name="9004">
<Config imports="router">
<Section name="x">
<Parameter name="a" value="5" />
<Parameter name="b" value="6" />
<Parameter name="c" value="7" />
<Parameter name="d" value="8" />
<Parameter name="e" value="9" />
</Section>
</Config>
</Service>
</Settings>
</Smart>
我想從服務“9004”中名為“e”的參數中獲取值“9”,然后使用 Write-Host 導出或打印它。
有任何想法嗎? 我正在嘗試這個,但它沒有給我任何回報。
# Read the XML file
Write-Host "OPENING XML FILE";
$path = "\\$computer\$FileName"
[xml] $xml = Get-Content $path
# Filter the XML
$SectionName = "x"
$Section = $xml.Smart.Settings.Config.Section| Where-Object {$_.name -eq $SectionName}
Write-Host $Section
@Brazs,嘗試使用 XPath 到 select 基於路徑和名稱值的元素,就像這樣
$parameterElement = $xml.SelectSingleNode("//Section[@name='$SectionName']/Parameter[@name='e']")
您可以像這樣直接獲取屬性值
$parameterElement.value
或用一種方法
$parameterElement.GetAttribute('value')
編輯:搜索條件也可以擴展,所以
$parameterElement = $xml.SelectSingleNode("//Service[@name='$ServiceName']/Config/Section[@name='$SectionName']/Parameter[@name='e']")
找到所需的服務、任何配置、所需的部分和“e”參數。 例如,我留給您弄清楚如何針對特定配置或變量參數進行擴展。
一種不同的方法,可讓您根據需要動態選擇。
[xml]$XmlData = @'
<Smart>
<Settings>
<Config imports="alpha">
<Section name="x">
<Parameter name="a" value="true" />
<Parameter name="b" value="0" />
<Parameter name="c" value="13873" />
<Parameter name="d" value="true" />
<Parameter name="e" value="EAI" />
</Section>
<Section name="y">
<Parameter name="a" value="false" />
<Parameter name="b" value="1" />
<Parameter name="c" value="13874" />
<Parameter name="d" value="false" />
<Parameter name="e" value="EAI1" />
</Section>
</Config>
</Settings>
</Smart>
'@
($SectionData = Select-Xml -Xml $XmlData -XPath '//Section').Node
# Results
<#
name Parameter
---- ---------
x {a, b, c, d, e}
y {a, b, c, d, e}
#>
$SectionData.Node.SyncRoot |
Where-Object name -eq 'x'
# Results
<#
name Parameter
---- ---------
x {a, b, c, d, e}
#>
($SectionData.Node.SyncRoot |
Where-Object name -eq 'x').Parameter |
Where-Object name -eq 'e'
# Results
<#
name value
---- -----
e EAI
#>
(($SectionData.Node.SyncRoot |
Where-Object name -eq 'x').Parameter |
Where-Object name -eq 'e').Value
# Results
<#
EAI
#>
使用您的數字 XMLData,然后:
(((($SectionData.Node.SyncRoot |
Where-Object name -eq '9003').Config).Section).Parameter |
Where-Object -Property name -eq 'e').Value
# Results
<#
4
#>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.