【问题标题】:Powershell remove XML tagsPowershell 删除 XML 标签
【发布时间】:2017-02-13 22:11:53
【问题描述】:

我是 PowerShell 新手,正在尝试从我的 xml XML 文件中删除一个 XML 元素。

为此,我使用了以下来自Adding and Removing Xmlnode using Powershell的示例代码

该示例运行良好,但是当我尝试将其用于我的代码时,它不再起作用。代码如下:

$Output = "C:\Users\Desktop\resulttest.xml"
# Load the existing document
$Doc = [xml](Get-Content -Path C:\Users\Desktop\test.xml)

# Specify tag names to delete and then find them
$DeleteNames= "body"
($Doc.Task.ChildNodes | Where-Object { $DeleteNames -contains $_.Name }) | ForEach-Object {
    # Remove each node from its parent
    [void]$_.ParentNode.RemoveChild($_)
}
# Save the modified document
$Doc.Save($Output)

我使用以下示例 XML 文件:

<html>a
<body>b</body>
<Price>300</Price>
<Total> 5000 </Total>
 <Part_C>
 <Name>Jar</Name>
<Title>Mr</Title>
<CountryCode> 5000 </CountryCode>
</Part_C>
</html>

XML 文件的目标是删除多个标签,例如“价格”和“总计”或“价格”、“标题”、“总计”

但是当我运行代码时,它仍然包含这些标签。

我的问题是我做错了什么,如何确保 PowerShell 删除 XML 标记?

【问题讨论】:

    标签: xml powershell


    【解决方案1】:

    这非常有效。

    $Output = "resulttest.xml"
    $Doc = [xml]"<task><body>b</body><bla>bla</bla></task>"
    
    $DeleteNames = "body"
    
    $Doc.Task.ChildNodes | Where-Object { $DeleteNames -eq $_.Name } | ForEach-Object {
        $_.ParentNode.RemoveChild($_) | Out-Null
    }
    
    $Doc.Save($Output)
    

    我的猜测是$Doc.Task 实际上并没有在您的 XML 文档中选择任何内容。

    【讨论】:

      【解决方案2】:

      不用太深入,我认为问题可能在于您没有对$Doc 元素本身进行操作。我会直接在上面使用 XML 方法SelectNodes

      $Doc.ChildNodes.SelectNodes($DeleteNames) | Foreach-Object {
          $Doc.ChildNodes.RemoveChild($_)
      }
      $Doc.Save($Output)
      

      更新: 如果$DeleteNames 包含多个条件/节点,则需要将其设为数组并为每个条件调用一次代码(SelectNodes 不支持模式):

      ,"Price","Total" | Foreach-Object { 
          $Doc.ChildNodes.SelectNodes($_) | Foreach-Object {
      ...
      

      我想你可以使用例如做一个备用节点选择。 XPath,但我没有深入研究。

      【讨论】:

      • 新代码运行良好,但我现在遇到了另一个问题。问题是,当我尝试删除 等两个标签时,它不起作用。
      • 要使用我上面的代码,您需要将$DeleteNames 设为一个数组并相应地调用它。现在添加了。
      • 我已尝试更改代码,但现在出现以下错误:**“方法调用失败,因为 [System.Xml.XmlElement] 不包含名为 'SelectNode' 的方法。在 C:\Users \EX27740\Desktop\Eric 3 verwijderen meerdere rijen.ps1:9 char:5"** 我正在使用以下代码:**$Doc = [xml](Get-Content -Path C:\Users\EX27740\Desktop\ TestEric.xml) # 指定要删除的标签名称 $DeleteNames = ,"body","Price","Total" | Foreach 对象 { $Doc.ChildNodes.SelectNode($_)} | Foreach-Object { $Doc.ChildNodes.RemoveChild($DeleteNames) } $Doc.Save($Output) **
      • 对不起,上面的SelectNode 应该是SelectNodes。现已修复。
      猜你喜欢
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      相关资源
      最近更新 更多