使用Powershell Where-Object过滤xml

时间:2014-04-16 00:14:26

标签: xml powershell

分配是将以下xml代码读回Powershell并仅显示具有属性的项目:event =“1”。

xml file created by Powershell script createsim.ps1
<?xml version="1.0" encoding="utf-8"?>
<simulation name="Protocal Simulation">
  <duration type="clock">100000</duration>
  <density>1.1</density>
  <ideal_degree>12</ideal_degree>
  <radius>86</radius>
  <supportedchannels>[1,4,7,9,11,13]</supportedchannels>
  <class>Field.RandomField</class>
  <width>1000</width>
  <height>1000</height>
  <description event="1">Re-form the network</description>
  <action event="1">densityChangeDetected()</action>
  <description event="2">End the simulation</description>
  <action event="2">end()</action>
</simulation>"

管道输出脚本和导出对象。

PS C:\scripts> C:\scripts\createsim.ps1 | Export-Clixml C:\scripts\simtemp.xml

导入对象。

PS C:\scripts> $simxml = Import-Clixml C:\scripts\simtemp.xml

寻找事件属性。

PS C:\scripts> $xmlout = $simxml | Where-Object ($_.event -eq 1) | Sort-Object event

PS C:\scripts> $xmlout

PS C:\scripts> write-host $xmlout

没有错误消息,也没有打印出来。

我将不胜感激任何帮助或提示。我在Windows 8.1上使用Powershell 4.0

2 个答案:

答案 0 :(得分:1)

我不确定为什么Export-Clixml是必要的。如果createsim.ps1生成XML,则可以直接使用该XML而无需导出和导入。然后你的工作变得容易多了。假设您的脚本生成了帖子中记录的XML,则此代码为:

   > $xml = [XML](Get-Content C:\scripts\createsim.ps1)
   > foreach ($node in $xml.simulation.ChildNodes)
     {
        if ($node.event -eq 1) { $node.OuterXml }
     }

给你:

   <description event="1">Re-form the network</description>
   <action event="1">densityChangeDetected()</action>

答案 1 :(得分:0)

您可以使用以下方法尝试@djs解决方案:

$xml = [XML](Get-Content(C:\scripts\createsim.ps1))

你可以选择-Xml CmdLet试试:

Select-Xml -Path "C:\temp\test.xml" -XPath "/simulation/action[@event]" | % {$_.node}

Select-Xml -Path "C:\temp\test.xml" -XPath "/simulation/action" | where {$_.node.event -eq '1'} | % {$_.Node.OuterXml}

与@djs相同的结果:

Select-Xml -Path "C:\temp\test.xml" -XPath "/simulation/*[@event]" | where {$_.node.event -eq '1'} | % {$_.Node.OuterXml}