使用Powershell删除节点

问题描述:

<?xml version="1.0" encoding="UTF-8"?> 
    <People xmlns="TestData"> 
     <Person Id="TestData" Status="TestData"> 
     <Name> 
      <FirstName>TestData</FirstName> 
      <LastName>TestData</LastName> 
     </Name> 
     <Dimensions> 
      <Dimension Id="TestData" Name="TestData" Dimension="TestData" /> 
      <Dimension Id="TestData" Name="TestData" Dimension="TestData" /> 
      <Dimension Id="TestData" Name="TestData" Dimension="TestData" /> 
      <Dimension Id="TestData" Name="TestData" Dimension="TestData"/> 
     </Dimensions> 
     <EmploymentInformation> 
      <DateHired>TestData</DateHired> 
      <DateRehired>TestData</DateRehired> 
      <EmployeeStatus>TestData</EmployeeStatus> 
      <JobCode>TestData</JobCode> 
      <Supervisor Id="TestData" Name="TestData" /> 
      <Title>TestData</Title> 
     </EmploymentInformation> 
     </Person> 
    </People> 

我的XML文档在上面。我想删除'EmploymentInformation'下的节点'Supervisor'。我有一些麻烦,放在一起我的XPath ......这是我到目前为止有:使用Powershell删除节点

[xml]$xml = gc C:\Users\username\Downloads\Test.xml 

$supervisor = $xml.SelectSingleNode('//People/Person/EmploymentInformation/Supervisor') 
$employmentInformation = $xml.SelectSingleNode('//People/Person/EmploymentInformation') 
[void]$employmentInformation.RemoveChild($supervisor) 
$xml.Save('C:\Users\username\Downloads\Result.xml') 

嗨,你必须定义你的XML文档命名空间,但不符合您的XPath。这样做如下:

[xml]$xml = gc C:\Users\username\Downloads\Test.xml 

$mgr = New-Object -TypeName System.Xml.XmlNamespaceManager -ArgumentList $xml.NameTable 
$mgr.AddNamespace("bob","TestData") 

$supervisor = $xml.SelectSingleNode('//bob:People/bob:Person/bob:EmploymentInformation/bob:Supervisor', $mgr) 
$employmentInformation = $xml.SelectSingleNode('//bob:People/bob:Person/bob:EmploymentInformation', $mgr) 
[void]$employmentInformation.RemoveChild($supervisor) 
$xml.Save('C:\Users\username\Downloads\Result.xml') 

如果你想与多人这样做,那么下面应该这样做:

[xml]$xml = gc .\Test.xml 

$mgr = New-Object -TypeName System.Xml.XmlNamespaceManager -ArgumentList $xml.NameTable 
$mgr.AddNamespace("bob","TestData") 

$supervisors = $xml.SelectNodes('//bob:People/bob:Person/bob:EmploymentInformation/bob:Supervisor', $mgr) 

foreach ($supervisor in $supervisors) 
{ 
     $supervisor.ParentNode.RemoveChild($supervisor) 
} 

$xml.Save('.\Result.xml') 

,或者你可以使用XML PowerShell的内置支持:

[xml]$xml = gc .\Test.xml 

foreach ($supervisor in $xml.People.Person.EmploymentInformation.Supervisor) 
{ 
     $supervisor.ParentNode.RemoveChild($supervisor) 
} 

$xml.Save('.\Result.xml') 
+0

由于xml文档命名空间已从xmlns =“tnw:grc:import:people”更新为xmlns =“TestData” – DanL 2014-10-17 14:58:40

+0

感谢Dan!这很好,但我确实注意到它只是从第一个Person中删除主管...我没有将它包含在上面的XML文档中,但我有多个人希望删除此节点。 – mpalatsi 2014-10-17 17:31:55