我猜这很简单,我刚开始使用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>
我想把内容变成锯齿状的二维数组,所以系统会如下:
是否可以遍历每个元素并创建这样的数组?
我希望如上所述存储数据,以便我可以使用[0] [0]引用主机名,然后[1] [1..x]引用该主机的所有服务。
这有意义吗?
非常感谢任何帮助或更好的appraoch。
答案 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}