PowerShell XML Select 节点行为
PowerShell XML Select Nodes Behaviour
我有一个 XML,我想从中获取所有具有 DataSource='Action' 的节点,其中 Task Name='AddUsersToDistributionList'.
我尝试了下面的代码,但有趣的是它为我提供了所有任务的所有节点,其中 DataSource='Action',即使在 xpath 中特别提到了任务名称。
[xml] $XMLInput =@'
<Process Name="AddUsersToDistributionList" Description="">
<Tasks>
<Task Enabled="True" Name="AddUsersToDistributionList" Description="Add users to Distribution List" Application="MS Exchange 2013+" OS="MS WIN Server 2008+" Enabled1="False">
<TaskInputs>
<Parameter Name="DistributionListName1" Mandatory="True" Datatype="Dictionary" DataSource="Action" Action="Get-DictionaryValue"/>
<Parameter Name="DistributionListName2" Mandatory="True" Datatype="Array" DataSource="Action" Action="Get-ArrayValue"/>
<Parameter Name="DistributionListName3" Mandatory="True" Datatype="String" DataSource="Action" Action="Get-StringValue"/>
<Parameter Name="DistributionListName4" Mandatory="True" Datatype="String" DataSource="Fixed"/>
</TaskInputs>
<TaskFeatures>
<Feature Name="Test" Enabled="true" Description="This allows the users outside organization to send Email to this Distribution List">
<Parameter Name="DistributionListName5" Mandatory="True" Datatype="String" DataSource="Action" Action="Get-StringValue"/>
<Parameter1 DataSource="Action" Action="Get-StringValue"/>
</Feature>
</TaskFeatures>
</Task>
<CustomTask Enabled="True" Name="RemoveUsersToDistributionList" Description="Add users to Distribution List" Application="MS Exchange 2013+" OS="MS WIN Server 2008+" Enabled1="False">
<TaskInputs>
<Parameter Name="DistributionListName401" Mandatory="True" Datatype="Dictionary" DataSource="Action" Action="Get-DictionaryValue"/>
<Parameter Name="DistributionListName402" Mandatory="True" Datatype="Array" DataSource="Action" Action="Get-ArrayValue"/>
<Parameter Name="DistributionListName403" Mandatory="True" Datatype="String" DataSource="Action" Action="Get-StringValue"/>
</TaskInputs>
</CustomTask>
</Tasks>
</Process>
'@
$XPath = "//Task[@Name='AddUsersToDistributionList'] | //CustomTask[@Name='AddUsersToDistributionList']"
$XMLInput.selectnodes($XPath).selectnodes("//*[@DataSource='Action']")
输出
PS C:\Users\inspadhi\Desktop\Scripts> powershell.exe .\Test_Xpath.ps1
Name : DistributionListName1
Mandatory : True
Datatype : Dictionary
DataSource : Action
Action : Get-DictionaryValue
Name : DistributionListName2
Mandatory : True
Datatype : Array
DataSource : Action
Action : Get-ArrayValue
Name : DistributionListName3
Mandatory : True
Datatype : String
DataSource : Action
Action : Get-StringValue
Name : DistributionListName401
Mandatory : True
Datatype : Dictionary
DataSource : Action
Action : Get-DictionaryValue
Name : DistributionListName402
Mandatory : True
Datatype : Array
DataSource : Action
Action : Get-ArrayValue
Name : DistributionListName403
Mandatory : True
Datatype : String
DataSource : Action
Action : Get-StringValue
预期输出
Name : DistributionListName1
Mandatory : True
Datatype : Dictionary
DataSource : Action
Action : Get-DictionaryValue
Name : DistributionListName2
Mandatory : True
Datatype : Array
DataSource : Action
Action : Get-ArrayValue
Name : DistributionListName3
Mandatory : True
Datatype : String
DataSource : Action
Action : Get-StringValue
尝试以下操作(注意 .
):
$XMLInput.SelectNodes($XPath).
SelectNodes(".//*[@DataSource='Action']")
请注意,.SelectNodes()
可以访问 整个文档 ,而不管它是在哪个节点上调用的。
因此,//*
搜索整个文档中的所有元素,这违背了您 $XPath
查询的目的。
要从您在 上调用 .SelectNodes()
的节点开始搜索 ,请使用 .
开始查询,如上所示。
我有一个 XML,我想从中获取所有具有 DataSource='Action' 的节点,其中 Task Name='AddUsersToDistributionList'.
我尝试了下面的代码,但有趣的是它为我提供了所有任务的所有节点,其中 DataSource='Action',即使在 xpath 中特别提到了任务名称。
[xml] $XMLInput =@'
<Process Name="AddUsersToDistributionList" Description="">
<Tasks>
<Task Enabled="True" Name="AddUsersToDistributionList" Description="Add users to Distribution List" Application="MS Exchange 2013+" OS="MS WIN Server 2008+" Enabled1="False">
<TaskInputs>
<Parameter Name="DistributionListName1" Mandatory="True" Datatype="Dictionary" DataSource="Action" Action="Get-DictionaryValue"/>
<Parameter Name="DistributionListName2" Mandatory="True" Datatype="Array" DataSource="Action" Action="Get-ArrayValue"/>
<Parameter Name="DistributionListName3" Mandatory="True" Datatype="String" DataSource="Action" Action="Get-StringValue"/>
<Parameter Name="DistributionListName4" Mandatory="True" Datatype="String" DataSource="Fixed"/>
</TaskInputs>
<TaskFeatures>
<Feature Name="Test" Enabled="true" Description="This allows the users outside organization to send Email to this Distribution List">
<Parameter Name="DistributionListName5" Mandatory="True" Datatype="String" DataSource="Action" Action="Get-StringValue"/>
<Parameter1 DataSource="Action" Action="Get-StringValue"/>
</Feature>
</TaskFeatures>
</Task>
<CustomTask Enabled="True" Name="RemoveUsersToDistributionList" Description="Add users to Distribution List" Application="MS Exchange 2013+" OS="MS WIN Server 2008+" Enabled1="False">
<TaskInputs>
<Parameter Name="DistributionListName401" Mandatory="True" Datatype="Dictionary" DataSource="Action" Action="Get-DictionaryValue"/>
<Parameter Name="DistributionListName402" Mandatory="True" Datatype="Array" DataSource="Action" Action="Get-ArrayValue"/>
<Parameter Name="DistributionListName403" Mandatory="True" Datatype="String" DataSource="Action" Action="Get-StringValue"/>
</TaskInputs>
</CustomTask>
</Tasks>
</Process>
'@
$XPath = "//Task[@Name='AddUsersToDistributionList'] | //CustomTask[@Name='AddUsersToDistributionList']"
$XMLInput.selectnodes($XPath).selectnodes("//*[@DataSource='Action']")
输出
PS C:\Users\inspadhi\Desktop\Scripts> powershell.exe .\Test_Xpath.ps1
Name : DistributionListName1
Mandatory : True
Datatype : Dictionary
DataSource : Action
Action : Get-DictionaryValue
Name : DistributionListName2
Mandatory : True
Datatype : Array
DataSource : Action
Action : Get-ArrayValue
Name : DistributionListName3
Mandatory : True
Datatype : String
DataSource : Action
Action : Get-StringValue
Name : DistributionListName401
Mandatory : True
Datatype : Dictionary
DataSource : Action
Action : Get-DictionaryValue
Name : DistributionListName402
Mandatory : True
Datatype : Array
DataSource : Action
Action : Get-ArrayValue
Name : DistributionListName403
Mandatory : True
Datatype : String
DataSource : Action
Action : Get-StringValue
预期输出
Name : DistributionListName1
Mandatory : True
Datatype : Dictionary
DataSource : Action
Action : Get-DictionaryValue
Name : DistributionListName2
Mandatory : True
Datatype : Array
DataSource : Action
Action : Get-ArrayValue
Name : DistributionListName3
Mandatory : True
Datatype : String
DataSource : Action
Action : Get-StringValue
尝试以下操作(注意 .
):
$XMLInput.SelectNodes($XPath).
SelectNodes(".//*[@DataSource='Action']")
请注意,.SelectNodes()
可以访问 整个文档 ,而不管它是在哪个节点上调用的。
因此,//*
搜索整个文档中的所有元素,这违背了您 $XPath
查询的目的。
要从您在 上调用 .SelectNodes()
的节点开始搜索 ,请使用 .
开始查询,如上所示。