【问题标题】:Using Powershell to Delete Node使用 Powershell 删除节点
【发布时间】:2014-10-17 14:22:11
【问题描述】:
  <?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”下的节点“主管”。我在整理我的 XPath 时遇到了一些麻烦……这是我目前所拥有的:

[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 powershell xpath


    【解决方案1】:

    您好,您在 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')
    

    或者您可以使用 Powershell 对 XML 的内置支持:

    [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"
    • 谢谢丹!这很好用,但我确实注意到它只是从第一个人中删除主管......我没有将它包含在上面的 XML 文档中,但我有多个人想删除这个节点。
    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2021-12-18
    • 1970-01-01
    • 2018-06-26
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多