如何使用Powershell从XML循环和读取所有必需的属性值

时间:2018-12-18 08:55:07

标签: xml powershell foreach

我在文件“ Test1.xml”中具有以下XML数据:

<TextValuess>
  <TextValues Name="Value1" Override="true" Type="String">
      <DEV>Source=DEV;Catalog=DEV_DMT;Integrated Security=SSPI;</DEV>
      <INT10>Source=LAB;Catalog=TST_INT10;Integrated Security=SSPI;</INT10>
      <INT>Source=LAB1;Catalog=TST_INT1;Integrated Security=SSPI;</INT>
      <INT2>Source=LAB10;Catalog=TST_INT12;Integrated Security=SSPI;</INT2>
  </TextValues>
  <TextValues Name="ENVIRONMENT" Override="true" Type="String">
      <DEV>DEV</DEV>
      <INT10>INT10</INT10>
      <INT>INT1</INT>
      <INT2>INT15</INT2>
  </TextValues>
</TextValuess>

我想遍历所有属性,并通过PowerShell传递需要检索的参数来检索数据。

例如:如果我将Variable值作为INT10传递,则仅需要以下值:

Name               Value
----               -----
Value1             LAB
Environment        INT10

我能够使用下面的PowerShell命令检索元素值之一。

[xml]$XmlDocument = Get-Content D:\Roshan\Test1.xml
$XmlDocument.TextValuess.TextValues[0].INT10
$XmlDocument.TextValuess.TextValues[1].INT10

但是,基于文件,XML标记可能每次都会增加或减少。我需要遍历现有数据并获取结果。

我不确定如何使用foreach来读取文件中的所有值。

2 个答案:

答案 0 :(得分:2)

您可以简单地将TextValues传递到Select-Object并指定需要以下值的属性名称:

[xml]$XmlDocument = Get-Content D:\Roshan\Test1.xml

$XmlDocument.TextValuess.TextValues | Select-Object Name, INT10

答案 1 :(得分:0)

从XML结构中选择数据的最通用方法是XPath。在您的情况下,您将执行以下操作:

$child = 'INT10'
$XmlDocument.SelectNodes("//TextValues[./${child}]") | ForEach-Object {
    New-Object -Type PSObject -Property @{
        'Name'  = $_.Name
        'Value' = $_.$child
    }
} | Select-Object Name, Value

如果要从子节点中提取部分信息,则需要指定操作方式。例如:

($_.$child -split ';')[0] -replace '^Source='