PowerShell加载XML需显式指定UTF8编码并确保单根节点,用Select-Xml处理命名空间和嵌套更稳定,导出CSV前须统一字段顺序并显式处理空值。

用 Get-Content + [xml] 加载 XML 时要注意编码和根节点
PowerShell 默认用 UTF-16 读取 XML,但很多导出的 XML 文件是 UTF-8 且无 BOM,直接 Get-Content file.xml 可能报错 "Data at the root level is invalid"。必须显式指定编码,并确认 XML 有且仅有一个根节点。
- 优先用
Get-Content -Path "data.xml" -Encoding UTF8(PowerShell 6+)或Get-Content -Path "data.xml" -Encoding UTF8BOM(旧版需加 BOM) - 再转为 XML 对象:
[xml]$xml = Get-Content ...;若失败,先用记事本另存为 UTF-8 with BOM 再试 - 检查结构:
$xml.ChildNodes.Count应为 1,否则需手动定位到实际数据容器节点(如$xml.Root.Items.Item)
用 Select-Xml 提取多层嵌套节点更稳定
当 XML 结构含命名空间、重复子节点(如多个 )或路径较深时,[xml] 强转后手动遍历易出错。Select-Xml 支持 XPath,可精准定位并返回 XmlNode 集合,适合后续导出。
- 无命名空间示例:
Select-Xml -Path "data.xml" -XPath "//item" - 有命名空间时需注册前缀:
$ns = @{d="http://example.com/ns"}; Select-Xml -Path "data.xml" -XPath "//d:entry" -Namespace $ns - 结果对象的
.Node属性才是原始 XML 节点,提取属性用.Node.id,文本内容用.Node.InnerText
导出 CSV 前必须统一字段结构,避免列错位
XML 中每个 的子元素数量/顺序可能不一致(比如有的有 ,有的没有),直接转 PSCustomObject 后用 Export-Csv 会导致 CSV 列头混乱或数据偏移。
- 先定义固定字段顺序:
$props = @("id", "name", "price", "category") - 逐节点构造对象时,用
if ($node.price) { $node.price.'#text' } else { $null }显式处理缺失值 - 不要依赖
$node.ChildNodes | ForEach-Object { $_.Name, $_.'#text' }—— 节点顺序不保证,且#text可能含空白符 - 导出时加
-NoTypeInformation,否则首行会多出#TYPE System.Management.Automation.PSCustomObject
$xmlPath = "data.xml" $csvPath = "output.csv"稳定加载
$content = Get-Content -Path $xmlPath -Encoding UTF8 [xml]$xml = $content
提取所有 item 节点(假设结构为
) - ...
- ...
$items = $xml.root.item
构造对象数组
$data = foreach ($item in $items) { [PSCustomObject]@{ id = if ($item.id) { $item.id.'#text' } else { $null } name = if ($item.name) { $item.name.'#text' } else { $null } price = if ($item.price) { $item.price.'#text' } else { $null } category = if ($item.category) { $item.category.'#text' } else { $null } } }
导出,确保列顺序与定义一致
$data | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8
PowerShell 处理 XML 导出 CSV 最容易卡在编码识别和节点空值处理上,特别是当原始 XML 来自不同系统时,InnerText 和 '#text' 的差异、命名空间未声明、以及 UTF-8 无 BOM 文件被误读,这三处不提前验证,后面怎么调 Export-Csv 参数都没用。










