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] 来引用该主机的所有服务。

这有任何意义吗?

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

4

1 回答 1

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} 
于 2012-12-17T18:12:46.200 回答