代码之家  ›  专栏  ›  技术社区  ›  Roshan N

如何使用powershell循环并从xml读取所有必需的属性值

  •  0
  • Roshan N  · 技术社区  · 7 年前

    我在文件“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检索数据。

    例如:如果我将变量值作为int10传递,我只需要下面的值,如下所示:

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

    我能够使用下面的PuthS壳命令检索一个元素值。

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

    但是XML标记可能会根据文件的不同而每次都增加或减少。我需要循环使用现有的数据并得到结果。

    我不知道怎么用 foreach 读取文件中的所有值。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Ansgar Wiechers    7 年前

    从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='
    
        2
  •  2
  •   Janne Tuukkanen    7 年前

    你可以简单地管 TextValues Select-Object 并指定所需值的属性名:

    [xml]$XmlDocument = Get-Content D:\Roshan\Test1.xml
    
    $XmlDocument.TextValuess.TextValues | Select-Object Name, INT10