首页 > 解决方案 > PowerShell - xml 文件在同一元素名称上具有冲突的多个命名空间

问题描述

与 PowerShell 5.1 相关

我正在使用 XML 来展示如何处理冲突的名称空间。这是我创建的示例:

<Employees> 
   <ms:Employee id='1' xmlns:ms="MicrosoftEmployees"> 
       <FirstName>Bill</FirstName>
       <LastName>Gates</LastName>
   </ms:Employee>
   <ms:Employee id='2' xmlns:ms="MicrosoftEmployees"> 
       <FirstName>Paul</FirstName>
       <LastName>Allen</LastName>
   </ms:Employee>
   <ap:Employee id='1' xmlns:ap="AppleEmployees"> 
       <Name>Steve Jobs</Name>
   </ap:Employee>
   <ap:Employee id='2' xmlns:ap="AppleEmployees"> 
       <Name>Steve Wozniak </Name>
   </ap:Employee>
</Employees>

该场景可能是合并来自两家不同公司的数据。

PowerShell演示程序:

cls 
$filename = "c:\XMLClass\IntroSamples\Sample05_Simpler_Namespace.xml"
[xml]$xmlDoc = Get-Content $filename 

$xmlDoc.Employees.Employee[0]
$xmlDoc.Employees.Employee[1]
$xmlDoc.Employees.Employee[2]
$xmlDoc.Employees.Employee[3]

输出:

id ms                 FirstName LastName
-- --                 --------- --------
1  MicrosoftEmployees Bill      Gates   
2  MicrosoftEmployees Paul      Allen   
1                                       
2                                       

反正有没有得到更合乎逻辑的输出?

似乎 PowerShell 锁定到它为 Employee 元素看到的第一个模式,然后无法显示 Apple 员工的 Name 元素。这实际上是有道理的,但我只是在检查是否有一些更好的东西来处理这个我可能会丢失的东西。

我知道我可以使用 SelectSingleNodes 和 XPath,但只是想看看 PowerShell 是否以及如何处理这个“开箱即用”。

如果我反转代码:

$xmlDoc.Employees.Employee[2]
$xmlDoc.Employees.Employee[3]
$xmlDoc.Employees.Employee[1]
$xmlDoc.Employees.Employee[0]

然后输出是:

id ap             Name          
-- --             ----          
1  AppleEmployees Steve Jobs    
2  AppleEmployees Steve Wozniak 
1                 ms:Employee   
2                 ms:Employee 

标签: powershellxml-namespaces

解决方案


使用格式列表查看所有属性。Format-table 不能很好地处理不同的属性集。

$xmldoc.employees.employee | format-list

id        : 1
ms        : MicrosoftEmployees
FirstName : Bill
LastName  : Gates

id        : 2
ms        : MicrosoftEmployees
FirstName : Paul
LastName  : Allen

id   : 1
ap   : AppleEmployees
Name : Steve Jobs

id   : 2
ap   : AppleEmployees
Name : Steve Wozniak 


推荐阅读