簡體   English   中英

Powershell 腳本搜索 XML 子元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM