在Powershell中迭代XML

时间:2015-11-12 14:21:47

标签: xml powershell

我正在处理XML内容(下面),想要迭代Student元素的值和Gender的相应值,然后最后检查学生姓名是否为Anne,将Gender打印为女性。

但是当我尝试使用下面的脚本时,我得到的输出是 -

Anne is Male
Anne is Male
Anne is Female

这可能是什么问题?我可以在这里得到一些帮助吗?

XML内容:

?xml version="1.0"?>
    <Objects>
      <Object Type="System.Management.Automation.CustomObject">
        <Property Name="Gender" Type="Application.String">Male</Property>
        <Property Name="Student" Type="Microsoft.Application.Service">John</Property>
      </Object>
      <Object Type="System.Management.Automation.CustomObject">
        <Property Name="Gender" Type="Application.String">Male</Property>
        <Property Name="Student" Type="Microsoft.Application.Service">Charles</Property>
      </Object>
    <Object Type="System.Management.Automation.CustomObject">
       <Property Name="Gender" Type="Application.String">Female</Property>
       <Property Name="Student" Type="Microsoft.Application.Service">Anne</Property>
    </Object>
</Objects>

这是脚本:

[xml]$file = Get-Content C:\xml-report.xml
foreach ($obj in $file.Objects.Object.Property) {
  if('Student'-contains $obj.Name) {
    $name = $obj.'#text'
    }
  if('Gender' -contains $obj.Name) {
    $gend = $obj.'#text'  
    }
       if ($name = "Anne") { 
       Write-Host $name "is" $gend
    }
}

1 个答案:

答案 0 :(得分:4)

您需要开始迭代对象而不是对象的属性,然后从对象的每个属性中选择相关数据。

您还需要使用正确的语法来测试相等性,在Powershell中它是-eq。有关详情,请输入Get-Help about_comparison_operators

尝试:

foreach ($obj in $file.Objects.Object) {
  $gend = $obj.Property | ? { $_.Name -eq 'Gender' } | Select -expand '#text'
  $name = $obj.Property | ? { $_.Name -eq 'Student' } | Select -expand '#text'
  if ($name -eq 'Anne') {
    Write-Output "$name is $gend"
  }
}

?Where-Object的别名,允许您根据其属性过滤集合。