xml - 如何在对象中列出 Powershell 中复杂 xml 中的两个元素

标签 xml powershell

  • 我正在尝试创建一个包含计算机名称及其相关 IP 地址的对象
  • 我有以下 XML 将我的所有计算机映射到它们的 ip:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<hq>
    <dbs>
        <db>
            <ip>153.77.162.62</ip>
            <cn>SRRAALABJHQDB</cn>
        </db>
    </dbs>
    <mbs>
        <mb>
            <ip>153.77.162.63</ip>
            <cn>SRRAALABJHQRBT</cn>
        </mb>
    </mbs>
    <apps>
        <app>
            <ip>153.77.162.61</ip>
            <cn>SRRAALABJHQIIS</cn>
        </app>
    </apps>
    <sts>
        <st>
            <dbs>
                <db>
                    <ip>153.77.162.64</ip>
                    <cn>SRRAALABJST1</cn>
                </db>
            </dbs>
            <mbs>
                <mb>
                    <ip>153.77.162.64</ip>
                    <cn>SRRAALABJST1</cn>
                </mb>
            </mbs>
            <apps>
                <app>
                    <ip>153.77.162.64</ip>
                    <cn>SRRAALABJST1</cn>
                </app>
            </apps>
            <poss>
                <pos>
                    <dbs>
                        <db>
                            <cn>DTRAALABJPOS1</cn>
                        </db>
                    </dbs>
                    <apps>
                        <app>
                            <ip>153.77.162.66</ip>
                            <cn>DTRAALABJPOS1</cn>
                        </app>
                    </apps>
                </pos>
                <pos>
                    <dbs>
                        <db>
                            <cn>DTRAALABJPOS2</cn>
                        </db>
                    </dbs>
                    <apps>
                        <app>
                            <ip>153.77.162.67</ip>
                            <cn>DTRAALABJPOS2</cn>
                        </app>
                    </apps>
                </pos>
            </poss>
        </st>
        <st>
            <buid>100</buid>
            <dbs>
                <db>
                    <ip>153.77.162.65</ip>
                    <cn>SRRAALABJST2</cn>
                </db>
            </dbs>
            <mbs>
                <mb>
                    <ip>153.77.162.65</ip>
                    <cn>SRRAALABJST2</cn>
                </mb>
            </mbs>
            <apps>
                <app>
                    <ip>153.77.162.65</ip>
                    <cn>SRRAALABJST2</cn>
                </app>
            </apps>
            <poss>
                <pos>
                    <dbs>
                        <db>
                            <cn>DTRAALABJPOS3</cn>
                        </db>
                    </dbs>
                    <apps>
                        <app>
                            <ip>153.77.162.68</ip>
                            <cn>DTRAALABJPOS3</cn>
                        </app>
                    </apps>
                </pos>
            </poss>
        </st>
    </sts> 
</hq>
  • 我需要创建一个对象来保存值(cn 是 Computer Name 的缩写)

  • 我尝试了以下脚本来创建这样一个对象:

$path = "C:\lab_j.xml"
[xml] $lab = Get-Content -Path $Path 


$vms = $lab | Select-Xml "//cn" | ForEach-Object { $_.Node.InnerText } | Select-Object -Unique
$ips = $lab | Select-Xml "//ip" | ForEach-Object { $_.Node.InnerText } | Select-Object -Unique

$vmObject = New-Object PSObject


Foreach ($vm in $vms) {

    if ([bool]($vmObject.psobject.Properties | where { $_.Name -eq "name"})) {
        $vmObject.name = $vm
    }
    else
    {
        $vmObject | Add-Member -MemberType NoteProperty -Name 'name' -Value $vm -Force
    }
}

Foreach ($ip in $ips) {
    
    if ([bool]($vmObject.psobject.Properties | where { $_.Name -eq "ip"})) {
        $vmObject.ip = $ip
    }
    else
    {
        $vmObject | Add-Member -MemberType NoteProperty -Name 'ip' -Value $ip -Force
    }
}
  • $vmObject 的输出只给出一个“条目”:
PS C:\Users\hiddai> $vmObject

name          ip           
----          --           
DTRAALABJPOS3 153.77.162.68

代替:

PS C:\Users\hiddai> $vmObject

name           ip           
----           --           
SRRAALABJHQDB  153.77.162.62
SRRAALABJHQRBT 153.77.162.63
SRRAALABJHQIIS 153.77.162.61
SRRAALABJST1   153.77.162.64
DTRAALABJPOS1  153.77.162.66
DTRAALABJPOS2  153.77.162.67
SRRAALABJST2   153.77.162.65
DTRAALABJPOS3  153.77.162.68
  • 是否有创建此类对象的简短方法?

最佳答案

the output of $vmObject give only one "entry":

那是因为您只创建了 1 个对象,然后不断覆盖它的值。

Is there a short and simple way to create such an object?

是的,您可以使用单个 XPath 查询来查找任何具有 <cn> 的 XML 元素和一个 <ip>子节点,然后使用 Select-Object 创建结果对象:

$lab.SelectNodes('//*[./cn and ./ip]') |Select-Object @{Name='Name';Expression='cn'},@{Name='IP';Expression='ip'}

关于xml - 如何在对象中列出 Powershell 中复杂 xml 中的两个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74276787/

相关文章:

xml - 尝试在 Google map 查询后获取 XML 文件

xml - 如何在xpath marklogic中传递变量中的元素名称?

powershell - 为什么 Set-ItemProperty 对 Windows 10 下的 IIS 应用程序没有效果?

powershell - 调用远程 powershell 命令未返回所有结果

java - 如何在<?xml版本="1.0"编码="UTF-8"?>之后强制java xml dom生成换行符?

java - XML 响应时间 ejabberd

python - 如何以字符串形式获取 XML 元素的内容?

powershell - 检查管理员权限在某些服务器上不起作用的代码

powershell - 如果可以运行包含选项的命令,如何使用Powershell进行验证?

powershell - 快速对包含大量日期的数组进行排序