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

PowerShell解析XML时仅获取最后一组RDF描述数据的问题解决:如何提取XML中的多组值

PowerShell解析XML时仅获取最后一组RDF描述数据的问题解决:如何提取XML中的多组值

嘿,我明白你碰到的问题了!你的脚本现在只能拿到最后一组<rdf:Description>数据,核心原因是你在循环外只创建了一个哈希表,每次处理新的描述节点时,都会覆盖哈希表里的旧值,最后自然只剩最后一组数据啦。咱们调整下思路,让脚本逐个处理每个描述节点,为每个节点生成独立的对象,这样就能把所有组的数据都捞出来了。

问题根源拆解

原脚本里的$ht是在所有循环之外初始化的,每处理一个<rdf:Description>节点,都会重复给ht['about']和ht["Field$i"]赋值,前面节点的数据直接被后面的覆盖了,所以最终只保留了最后一次循环的结果。

修改后的完整脚本

$docPath = 'C:\ACG\Profium\export_20230203\_http___www.profium.com_docman_ImageSet__objects.rdf'

$xmlFile = [xml]::new()
$xmlFile.Load((Convert-Path -LiteralPath $docPath))

# 准备一个数组来存储所有描述节点的对象
$results = @()

# 遍历每一个rdf:Description节点
$xmlFile.rdf.Description | ForEach-Object {
    # 为当前节点创建独立的有序哈希表
    $ht = [ordered]@{}
    
    # 提取当前节点的about属性
    $ht['about'] = $_.about

    # 提取当前节点下需要的子节点,按字段名存储(不再用Field1、Field2)
    $_.ChildNodes | Where-Object Name -match 'modified|normal|creator|created|contentType|originalFileName|contentDescription|description|modifier' | ForEach-Object {
        # 处理节点值:优先取#text,没有则取resource属性
        $value = if ($_.'#text') { $_.'#text' } else { $_.resource }
        # 用节点的Name作为哈希表的键,这样输出的列名更直观
        $ht[$_.Name] = $value
    }

    # 将当前节点的哈希表转为自定义对象,加入结果数组
    $results += [PSCustomObject]$ht
}

# 输出所有结果,用表格展示
$results | Format-Table -AutoSize -Wrap

关键修改点说明

  • 把哈希表的创建放到了<rdf:Description>节点的循环内部,每个节点都有自己独立的哈希表,不会互相覆盖
  • 不再用Field1、Field2这种模糊的键名,而是直接用子节点的Name(比如modified、creator)作为键,输出的表格列名更清晰,可读性更强
  • 用数组$results收集每个节点生成的对象,最后统一输出所有结果

这样修改后,你的脚本就能把XML里所有的<rdf:Description>节点数据都提取出来,每个节点对应一行表格数据啦!

备注:内容来源于stack exchange,提问作者baconfeltoon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:09:10