【问题标题】:Powershell loop through xml to create a jagged arrayPowershell循环通过xml创建一个锯齿状数组
【发布时间】:2012-12-04 20:48:23
【问题描述】:

我猜这很简单,我只是从 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>

我想把内容放入一个锯齿状的二维数组中,所以系统会如下结束:

  • (host1),(service1,service2)
  • (主机2),(服务1)

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

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

这有意义吗?

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

【问题讨论】:

    标签: xml powershell xml-parsing powershell-3.0


    【解决方案1】:

    您可能会考虑为此使用哈希表。您仍然可以遍历结果,并且可以按主机名查找结果,例如:

    $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} 
    

    【讨论】:

    • 感谢您的快速回复。就像我说的那样澄清一下,我对这一切都很陌生,您的解决方案基本上会创建一个哈希表,但用一组服务替换其中一个键值对?
    • 它为每个主机名创建一个条目,该条目的值将是一个服务名称数组。
    • 太棒了,非常感谢,非常感谢您的帮助和建议。明天我肯定会尝试一下。我刚刚测试了上面的代码,似乎为服务分配了空值,所以我猜我需要做一些尝试,但这都是学习的一部分:-)
    • 为后续问题道歉,我已经意识到我真正想要的是能够将所有数据提取到特定系统的哈希表中......所以例如只是 ....... 标签,所以基本上为每个主机名和组成“系统”的相关服务创建一个 has 表
    • 如果我修改 Select-Xml -XPath 部分,我能做到这一点吗?再次感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    相关资源
    最近更新 更多