使用PowerShell提取多XML文件CDATA内容并导出CSV的求助
提取XML文件中CDATA内容并导出到CSV(PowerShell)
我是PowerShell新手,想要遍历指定文件夹下的所有XML文件,提取每个文件里CDATA标签内的文本,最后把结果导出到CSV文件。另外还需要处理一个情况:CDATA内容两侧可能有多余空格,输出时要把这些空格去掉,而且CDATA在每行里的位置不固定。
目前我用的脚本会返回文件名、行号以及带可变空格的CDATA标签,但我只需要CDATA标签里的内容:
Get-ChildItem -Path "C:\temp" -Filter "*.xml" -Recurse | Where-Object { !$_.PSItem } | Select-String "\[[^\[\]]*?\]" -Pattern > export.csv
XML文件示例:
<Name> <![CDATA[value]]>. </Name> <Name><![CDATA[value]]></Name> <Name> <![CDATA[value]]></Name>
修正后的解决方案脚本
Get-ChildItem -Path "C:\temp" -Filter "*.xml" -Recurse | ForEach-Object { $file = $_ $lineNumber = 0 Get-Content $file.FullName | ForEach-Object { $lineNumber++ # 匹配CDATA标签并捕获内部内容 if ($_ -match '<!\[CDATA\[([\s\S]*?)\]\]>') { # 去除内容两侧的多余空格 $cleanContent = $matches[1].Trim() # 构造输出对象 [PSCustomObject]@{ 文件名 = $file.Name 行号 = $lineNumber CDATA内容 = $cleanContent } } } } | Export-Csv -Path "export.csv" -Encoding UTF8 -NoTypeInformation
关键说明
- 移除了原脚本中错误的
Where-Object { !$_.PSItem },这行代码会过滤掉所有文件,导致无输出 - 使用正则表达式
<!\[CDATA\[([\s\S]*?)\]\]>精准匹配CDATA标签,([\s\S]*?)捕获标签内的所有内容(包含换行) - 通过
Trim()自动去除CDATA内容两侧的空格、制表符等空白字符 - 用
PSCustomObject生成结构化数据,确保CSV输出的列名和内容对应 Export-Csv的-NoTypeInformation参数避免CSV开头出现多余的类型信息
如果不需要行号字段,只需删除行号 = $lineNumber这一行即可。
内容的提问来源于stack exchange,提问作者Mdog202
相关产品推荐
相关产品推荐

