如何使用PowerShell读取XML并转换写入为CSV文件?
解决PowerShell转换XML到CSV/JSON的问题
为什么直接用Import-Clixml不行?
Import-Clixml是PowerShell专门用于导入自身序列化生成的XML(即Export-Clixml输出的文件),这类XML包含PowerShell对象的元数据,和普通业务XML结构完全不同。直接用它导入books.xml会得到异常的对象结构,自然无法正确导出为CSV。
正确转换XML到CSV的步骤
1. 加载普通XML文件
使用[xml]类型加速器加载XML内容,而非Import-Clixml:
$xml = [xml](Get-Content -Path .\books.xml -Raw)
2. 提取并转换XML节点为对象
遍历XML中的目标节点(比如catalog/book),将节点的属性和子元素映射为自定义对象的属性:
$books = $xml.catalog.book | ForEach-Object { [PSCustomObject]@{ ID = $_.id # 提取book节点的id属性 Author = $_.author.InnerText # 提取author子元素的文本 Title = $_.title.InnerText Genre = $_.genre.InnerText Price = [decimal]$_.price.InnerText # 可选:转换为对应数据类型 PublishDate = [DateTime]$_.publish_date.InnerText Description = $_.description.InnerText } }
3. 导出为CSV
使用Export-Csv导出,加上-NoTypeInformation去掉多余的类型头:
$books | Export-Csv -Path .\books.csv -NoTypeInformation -Encoding UTF8
解决JSON截断问题
PowerShell的ConvertTo-Json默认序列化深度为2,若XML嵌套层次较深,会自动截断内容。解决方法是指定足够大的-Depth参数:
# 沿用上面的$books对象 $books | ConvertTo-Json -Depth 10 | Out-File .\books.json -Encoding UTF8
注意事项
- 如果XML结构更复杂(比如存在重复子节点、多层嵌套),需要调整
ForEach-Object中的对象构造逻辑,确保所有需要的字段都被正确提取。 - 转换数据类型(如价格转decimal、日期转DateTime)可以避免CSV/JSON中出现格式错误。
内容的提问来源于stack exchange,提问作者Nicholas Saunders
相关产品推荐
相关产品推荐

