使用名称' name'访问XML元素值和'价值'

时间:2015-09-25 21:02:19

标签: xml powershell foreach

在PowerShell中,给出以下部分XML结构:

<ExtraAttributes Enabled="1" PerBuildingEnabled="0" PerBuildingMode="0">
  <!--PerBuildingMode 0: Inclusively district and building, Mode 1: Exclusively building-->
  <Attributes>
    <A Enabled="1">
      <name>mail</name>
      <value>$UserPrincipalName</value>
    </A>
    <A Enabled="1">
      <name>ipPhone</name>
      <value>123456</value>
    </A>
  </Attributes>
</ExtraAttributes>

如果我尝试使用以下内容访问其中一个value元素的值:

# $ExtraAttributes is extracted as [Xml.XmlElement] from an [Xml.XmlDocument]
foreach ($att in ($ExtraAttributes.Attributes.ChildNodes | where { [int]$_.Enabled -eq $true })) {
    Write-Host "Name: $($att.name), Value: $($att.value)"
}

它工作得很好......但是,如果A下只有一个Attributes元素,那么:

<ExtraAttributes Enabled="1" PerBuildingEnabled="0" PerBuildingMode="0">
  <!--PerBuildingMode 0: Inclusively district and building, Mode 1: Exclusively building-->
  <Attributes>
    <A Enabled="1">
      <name>mail</name>
      <value>$UserPrincipalName</value>
    </A>
  </Attributes>
</ExtraAttributes>

Powershell认为$att.value$null

当只有一个A元素与同一个foreach循环一起出现时,如何访问这些元素值? XML可以重组,但我试图避免这种情况。

1 个答案:

答案 0 :(得分:0)

我没有使用childNodes,而是使用了元素名称A

foreach ($att in ($ExtraAttributes.Attributes.A | where { [int]$_.Enabled -eq $true })) {
Write-Host "Name: $($att.name), Value: $($att.value)"
}

它是否按预期工作,是否只有一个或多个A元素。我从未弄清楚为什么childNodes不能让它发挥作用。