Powershell循环遍历xml以创建锯齿状数组

时间:2012-12-17 18:03:02

标签: xml powershell xml-parsing powershell-v3.0

我猜这很简单,我刚开始使用PowerShell,几个小时后我就无法找到一个简单的解决方案。

基本上我有以下xml文件

<Config>
<System>
<Server>
    <Name>host1</Name> 
    <Service>service1</Service>
    <Service>service2</Service>
</Server>
<Server>
    <Name>host2</Name> 
    <Service>service1</Service>
</Server>
</System>

<System2>
<Server>
    <Name>host1</Name> 
    <Service>service1</Service>
    <Service>service2</Service>
</Server>
<Server>
    <Name>host2</Name> 
    <Service>service1</Service>
     <Service>service2</Service>
     <Service>service3</Service>

</Server>
</System2>
</Config>

我想把内容变成锯齿状的二维数组,所以系统会如下:

  • (主机1),(服务1,服务2)
  • (主机2),(服务1)

是否可以遍历每个元素并创建这样的数组?

我希望如上所述存储数据,以便我可以使用[0] [0]引用主机名,然后[1] [1..x]引用该主机的所有服务。

这有意义吗?

非常感谢任何帮助或更好的appraoch。

1 个答案:

答案 0 :(得分:3)

您可能会考虑使用散列表。您仍然可以迭代结果,您可以按主机名查找结果,例如:

$xml = [xml]@'
    <Config>
    <System>
    <Server>
        <Name>host1</Name> 
        <Service>service1</Service>
        <Service>service2</Service>
    </Server>
    <Server>
        <Name>host2</Name> 
        <Service>service1</Service>
    </Server>
    </System>

    <System2>
    <Server>
        <Name>host1</Name> 
        <Service>service1</Service>
        <Service>service2</Service>
    </Server>
    <Server>
        <Name>host2</Name> 
        <Service>service1</Service>
        <Service>service2</Service>
        <Service>service3</Service>
    </Server>
    </System2>
    </Config>
'@

$ht = @{}
$hostnameNodes = $xml | Select-Xml -XPath '//Name'
foreach ($node in @($xml | Select-Xml -XPath '//Name'))
{
    $hostname = $node.Node.InnerText.Trim()
    $services = @($node.Node.ParentNode.Service)
    foreach ($service in $services)
    {
        $ht["$hostname"] += @($service.Trim())
    }
}

$ht

输出:

Name                           Value                                    
----                           -----                                    
host1                          {service1, service2, service1, service2} 
host2                          {service1, service1, service2, service3}