Powershell xml访问密钥对值

Posted

技术标签:

【中文标题】Powershell xml访问密钥对值【英文标题】:Powershell xml accessing key pair value 【发布时间】:2015-10-23 02:25:10 【问题描述】:

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

例如:$xml.array.dict.key.name -> bob, kate, john

$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>
'@

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

输出

name   age   gender
---    --    -----
bob    35    male
kate   12    female
john   57    male

这是我尝试过的。

$xmldata = [xml]$xml
$xmldict = $xmldata.plist.array.dict
$xmldict

这给出了输出

key                                    string
---                                    ------
name, age, gender                    bob, 35, male
name, age, gender                    kate, 12, female
name, age, gender                    john, 57, male

$xmldict.key

name
age
gender
name
age
gender
name
age
gender

【问题讨论】:

就个人而言,我会找到一个.Net plist parser 并使用它或以其他方式转换它。除此之外,这不是代码编写服务。尝试一些东西,当你遇到困难时返回你自己的代码。 【参考方案1】:

这有点奇怪,您依赖于键/字符串元素对的顺序。但是,这对您的 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
    

这个版本在本质上更通用一些 - 不依赖于 string 元素名称:

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

【讨论】:

谢谢伙计。你是一个传奇。您将如何更改您的代码以使其具有通用性,以便当节点可能是整数或日期而不是字符串时它能够工作。 我想我们永远不会知道

以上是关于Powershell xml访问密钥对值的主要内容,如果未能解决你的问题,请参考以下文章

使用 PowerShell 生成 Azure 存储帐户 SAS 密钥

在DAX / Power BI中对值进行排序

PowerShell ISE:调试从 power-shell 脚本调用的另一个 power-shell 脚本

在 Server Core 2019 上使用具有本地帐户的 Power Shell Remoting 时访问被拒绝

仅当特定密钥对值与可迭代匹配时,才在 JSON 对象中获取多个 JSON 密钥对值

从 Powershell 获取 Azure Active Directory 访问令牌