PowerShell解析CycloneDX BOM XML文件出现类型转换报错如何解决?
PowerShell 读取CycloneDX BOM生成组件清单MD文件方案
错误原因说明
- 直接用
Get-Content默认返回的是字符串数组,强转[XML]需要传入完整单字符串;同时未指定编码时无法正确识别UTF-16LE格式文件 Select-Xml的-Xml参数仅接受XML对象,传入文件路径需要用-Path参数,参数类型不匹配会触发转换报错
完整可运行代码
# 1. 自定义配置参数 $bomPath = "替换为你的BOM文件本地路径,例如C:\项目\bom.xml" $outputMdPath = "替换为输出MD文件路径,例如C:\项目\第三方组件清单.md" # 命名空间适配:打开BOM文件查看根节点<bom>的xmlns属性值,和下方值保持一致即可 $ns = @{ bom = "http://cyclonedx.org/schema/bom/1.5" } # 2. 兼容多编码读取XML文件,自动识别UTF-16LE等格式 $xml = New-Object -TypeName System.Xml.XmlDocument $xml.Load($bomPath) # 3. 提取所有组件节点 $components = Select-Xml -Xml $xml -XPath "//bom:component" -Namespace $ns # 4. 处理组件字段,兼容空值/多许可证场景 $componentList = foreach ($item in $components) { $node = $item.Node # 许可证优先取标准ID,其次取自定义名称,无许可证显示「未声明」 $licenses = $node.licenses.license | ForEach-Object { $_.id ?? $_.name } $licenseStr = $licenses ? ($licenses -join ", ") : "未声明" [PSCustomObject]@{ 组件名称 = $node.name 版本号 = $node.version 许可证 = $licenseStr } } # 5. 生成Markdown格式文件 $mdContent = @" # 第三方组件依赖清单 | 组件名称 | 版本号 | 许可证 | | -------- | ------ | ------ | $($componentList | ForEach-Object { "| $($_.组件名称) | $($_.版本号) | $($_.许可证) |" } -join "`n") "@ Set-Content -Path $outputMdPath -Value $mdContent -Encoding UTF8
使用注意事项
- 命名空间必须和你的BOM文件版本匹配,常见的CycloneDX 1.4版本对应值为
http://cyclonedx.org/schema/bom/1.4,直接替换代码中对应值即可 XmlDocument.Load()方法会自动识别XML文件头的编码标识,无需手动指定UTF-16LE等编码格式,兼容性远高于Get-Content读取方案- 如果需要调整输出MD的表头、字段顺序,直接修改最后生成
$mdContent部分的格式即可
内容的提问来源于stack exchange,提问作者bobby17jones
相关产品推荐
相关产品推荐

