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
相关产品推荐
相关产品推荐

