You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将XML导入PowerShell并转为哈希表/PSObject结构化数据

PowerShell导入XML并转为哈希表/PSObject的可行方案

先解决XML读取的编码问题

你之前遇到的错误核心是编码不匹配,比如无BOM的UTF-16文件无法被默认方法正确识别。用Get-Content指定编码读取是最稳妥的方式:

# 根据你的XML实际编码选择(示例XML是UTF-8,若原文件是UTF-16无BOM,替换为-Encoding Unicode)
$xmlContent = Get-Content -Path "C:\Temp\your-file.xml" -Raw -Encoding UTF8
[xml]$xmlObject = $xmlContent

验证读取是否成功:

# 查看根节点属性
$xmlObject.results.command
$xmlObject.results.result

# 查看items容器的属性
$xmlObject.results.items.display_path

转为PSObject(推荐,方便后续操作)

将XML中的<item>节点批量转为PowerShell自定义对象,直接支持筛选、排序等操作:

$items = $xmlObject.results.items.item | ForEach-Object {
    [PSCustomObject]@{
        ID         = $_.id
        Name       = $_.name
        FullPath   = $_.path
        IsSelected = [bool][int]$_.sel # 把数字转为布尔值更直观
        Type       = $_.type
    }
}

# 查看所有项
$items

# 筛选已选中的项(sel=1)
$items | Where-Object IsSelected

转为哈希表

如果需要按文件名快速查找,可以将数据转为哈希表:

$itemHash = @{}
$xmlObject.results.items.item | ForEach-Object {
    $itemObj = [PSCustomObject]@{
        ID         = $_.id
        FullPath   = $_.path
        IsSelected = [bool][int]$_.sel
        Type       = $_.type
    }
    $itemHash[$_.name] = $itemObj
}

# 通过文件名快速访问
$itemHash["Recipes.lnk"]

之前错误的原因说明

  1. System.Net.WebClient.DownloadString是为网络资源设计的,读取本地文件时无法正确识别无BOM的UTF-16编码,导致XML内容解析失败。
  2. XmlDocument.Load()方法对编码格式要求严格,无BOM的Unicode文件会触发编码检测错误,而Get-Content允许手动指定编码,完美规避这个问题。

内容的提问来源于stack exchange,提问作者hellen_dorandt89

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:18:18