如何将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"]
之前错误的原因说明
System.Net.WebClient.DownloadString是为网络资源设计的,读取本地文件时无法正确识别无BOM的UTF-16编码,导致XML内容解析失败。XmlDocument.Load()方法对编码格式要求严格,无BOM的Unicode文件会触发编码检测错误,而Get-Content允许手动指定编码,完美规避这个问题。
内容的提问来源于stack exchange,提问作者hellen_dorandt89
相关产品推荐
相关产品推荐

