PowerShell处理XML去重 保留空VATRegistrationNumber节点
问题说明
处理XML格式供应商数据时需满足以下规则:
- 删除所有
VATRegistrationNumber(增值税注册号)属性值重复的供应商节点 - 所有
VATRegistrationNumber属性值为空的供应商节点必须全部保留,不得删除
现有PowerShell脚本运行存在逻辑错误:会将VATRegistrationNumber为空的节点判定为重复项移除,无法满足空值全保留的要求。
测试XML样例
<Suppliers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:supplier:erp-integration"> <Supplier SupplierNumber="300008755" CorporateGroupID="1000" Name1="PETER GOW" City="LISMORE" VATRegistrationNumber="60185579027" /> <Supplier SupplierNumber="300008754" CorporateGroupID="1000" Name1="DANIEL PETRUSHNKO" City="SYDNEY" VATRegistrationNumber="52216736429" /> <Supplier SupplierNumber="300008753" CorporateGroupID="1000" Name1="PEOPLE2PEOPLE" City="SYDNEY" VATRegistrationNumber="" /> <Supplier SupplierNumber="300008752" CorporateGroupID="1000" Name1="PEARL CLEANING" City="WOONONA" VATRegistrationNumber="29169648828" /> <Supplier SupplierNumber="300008751" CorporateGroupID="1000" Name1="PATTO'S PAINTLESS" City="TAMWORTH" VATRegistrationNumber="30482156828" /> <Supplier SupplierNumber="300008750" CorporateGroupID="1000" Name1="PATRICK ST CLINIC" City="PENGUIN" VATRegistrationNumber="53220182389" /> <Supplier SupplierNumber="300008749" CorporateGroupID="1000" Name1="MITCHELL PAISH" City="SYDNEY" VATRegistrationNumber="42091590585" /> <Supplier SupplierNumber="300008748" CorporateGroupID="1000" Name1="PACNET INTERNET" City="MELBOURNE" VATRegistrationNumber="69085213690" /> <Supplier SupplierNumber="300008747" CorporateGroupID="1000" Name1="NICHOLAS J OWENS" City="SYDNEY" VATRegistrationNumber="32168537004" /> <Supplier SupplierNumber="300008746" CorporateGroupID="1000" Name1="JOHN O'SULLIVAN" City="SYDNEY" VATRegistrationNumber="51136629180" /> <Supplier SupplierNumber="300008745" CorporateGroupID="1000" Name1="OSTAR ELECTRICAL" City="BANGALOW" VATRegistrationNumber="47196051022" /> <Supplier SupplierNumber="300008756" CorporateGroupID="1000" Name1="PKL COURIERS" City="PALM BEACH" VATRegistrationNumber="90690407812" /> <Supplier SupplierNumber="9008788" CorporateGroupID="2000" Name1="MICHAEL JOHN MCMANUS" City="COBAR" VATRegistrationNumber="51136629180" /> <Supplier SupplierNumber="9008787" CorporateGroupID="2000" Name1="MOREE PROPERTY" City="MOREE" VATRegistrationNumber="52216736429" /> <Supplier SupplierNumber="9008786" CorporateGroupID="2000" Name1="PATRICIA GOULD" City="MUDGEE" VATRegistrationNumber="" /> <Supplier SupplierNumber="9008785" CorporateGroupID="2000" Name1="KAREN DRUCE" City="Warrimoo" VATRegistrationNumber="42091590585" /> <Supplier SupplierNumber="9008784" CorporateGroupID="2000" Name1="SOLAR SOLUTIONS" City="MUDGEE" VATRegistrationNumber="65164304054" /> <Supplier SupplierNumber="9008783" CorporateGroupID="2000" Name1="ST GEORGES CHURCH" City="Hurstville" VATRegistrationNumber="79115673239" /> <Supplier SupplierNumber="9008782" CorporateGroupID="2000" Name1="SHARED VALUE" City="PORT MELBOURNE" VATRegistrationNumber="32168537004" /> <Supplier SupplierNumber="9008781" CorporateGroupID="2000" Name1="ALLEN KIRK" City="STUARTS POINT" VATRegistrationNumber="" /> <Supplier SupplierNumber="9008775" CorporateGroupID="2000" Name1="NATIONAL REMOVALS" City="ASHMORE" VATRegistrationNumber="19748626605" /> <Supplier SupplierNumber="9008774" CorporateGroupID="2000" Name1="INLAND CONTAINER" City="DUBBO" VATRegistrationNumber="78001638777" /> <Supplier SupplierNumber="9008814" CorporateGroupID="2000" Name1="CTARS PTY LTD" City="SYDNEY" VATRegistrationNumber="59603816593" /> <Supplier SupplierNumber="9008813" CorporateGroupID="2000" Name1="JENNY & MARSH" City="LAMBTON" VATRegistrationNumber="" /> <Supplier SupplierNumber="9008812" CorporateGroupID="2000" Name1="ACDMA CENTRE" City="Canley Vale" VATRegistrationNumber="58002378731" /> <Supplier SupplierNumber="9008999" CorporateGroupID="2000" Name1="CENTRAL HOTEL" City="Sydney" VATRegistrationNumber="47196051022" /> <Supplier SupplierNumber="9008969" CorporateGroupID="2000" Name1="ALES LICHNER" City="BANGOR" VATRegistrationNumber="" /> </Suppliers>
原有错误代码
[xml]$myfile = [xml](Get-content "input.xml") $nodesToRemove = $myfile.suppliers.childnodes | Group-Object VATRegistrationNumber | Foreach-Object { $_.Group | Select-Object -Skip 1 } $nodesToRemove | Foreach-Object { $myfile.suppliers.RemoveChild($_) } #save XML $myfile.Save("result.xml")
修正方案
错误原因是原有分组逻辑未区分空值与非空值,所有节点(包括VAT号为空的节点)都参与了分组去重,空值会被归为同一组,仅保留第一条,其余空值节点被误删。
修正逻辑:仅对非空VAT号的节点执行去重判断,空VAT号节点直接全部保留,不加入待删除列表。
修正后代码:
[xml]$myfile = [xml](Get-Content "input.xml") # 过滤掉空VAT号的节点,仅对非空VAT做去重校验 $nodesToRemove = $myfile.Suppliers.ChildNodes | Where-Object { -not [string]::IsNullOrEmpty($_.VATRegistrationNumber) } | Group-Object VATRegistrationNumber | ForEach-Object { $_.Group | Select-Object -Skip 1 } $nodesToRemove | ForEach-Object { $myfile.Suppliers.RemoveChild($_) } # 保存处理结果 $myfile.Save("result.xml")
代码修改点说明:
- 新增
Where-Object过滤步骤,在分组前就排除VAT号为空的节点,这类节点不会进入重复校验流程,不会被误删- 非空VAT号的节点沿用原有去重逻辑,同税号仅保留第一条出现的记录,其余重复节点删除,符合去重要求
内容的提问来源于stack exchange,提问作者Jana
相关产品推荐
相关产品推荐

