Powershell xml访问密钥对值

Ish*_*han 2 xml powershell plist

我有以下格式的示例 xml 文件。如何使用 Powershell 直接访问键的值?

例如: $xml.array.dict.key.name -> 鲍勃、凯特、约翰

$xml = @'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>name</key>
        <string>bob</string>
        <key>age</key>
        <string>35</string>
        <key>gender</key>
        <string>male</string>
    </dict>
    <dict>
        <key>name</key>
        <string>kate</string>
        <key>age</key>
        <string>12</string>
        <key>gender</key>
        <string>female</string>
    </dict>
    <dict>
        <key>name</key>
        <string>john</string>
        <key>age</key>
        <string>57</string>
        <key>gender</key>
        <string>male</string>
    </dict>
</array>
</plist>
'@
Run Code Online (Sandbox Code Playgroud)

如何将 xml 转换为 Powershell 对象,如下所示?

输出

name   age   gender
---    --    -----
bob    35    male
kate   12    female
john   57    male
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的。

$xmldata = [xml]$xml
$xmldict = $xmldata.plist.array.dict
$xmldict
Run Code Online (Sandbox Code Playgroud)

这给出了输出

key                                    string
---                                    ------
{name, age, gender}                    {bob, 35, male}
{name, age, gender}                    {kate, 12, female}
{name, age, gender}                    {john, 57, male}
Run Code Online (Sandbox Code Playgroud)

$xmldict.key

name
age
gender
name
age
gender
name
age
gender
Run Code Online (Sandbox Code Playgroud)

Kei*_*ill 5

这是一种有点奇怪的格式,您依赖于键/字符串元素对的顺序。然而,这对您的 XML 进行了测试:

$xml.plist.array.dict | 
    Foreach {
        $vals = $_.SelectNodes('string'); $_.SelectNodes('key') | 
        Foreach {$ht=@{};$i=0} {$ht[$_.'#text'] = $vals[$i++].'#text'} `
                {new-object psobject -property $ht}
    }
Run Code Online (Sandbox Code Playgroud)

这个版本本质上更通用——不依赖于string元素名称:

$xml.plist.array.dict | 
    Foreach {
        $_.SelectNodes('key') | 
        Foreach {$ht=@{}} {$ht[$_.'#text'] = $_.NextSibling.'#text'} `
                {new-object psobject -property $ht}
    }
Run Code Online (Sandbox Code Playgroud)