You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:55:15