使用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')
由于xml文档命名空间已从xmlns =“tnw:grc:import:people”更新为xmlns =“TestData” – DanL 2014-10-17 14:58:40
感谢Dan!这很好,但我确实注意到它只是从第一个Person中删除主管...我没有将它包含在上面的XML文档中,但我有多个人希望删除此节点。 – mpalatsi 2014-10-17 17:31:55