Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell删除XML标记_Xml_Powershell - Fatal编程技术网

Powershell删除XML标记

Powershell删除XML标记,xml,powershell,Xml,Powershell,我是PowerShell新手,正在尝试从我的XML文件中删除XML元素 为了做到这一点,我使用了从 该示例运行良好,但当我尝试将其用于代码时,它不再运行。代码如下: $Output=“C:\Users\Desktop\resultset.xml” #加载现有文档 $Doc=[xml](获取内容-路径C:\Users\Desktop\test.xml) #指定要删除的标记名,然后查找它们 $DeleteNames=“body” ($Doc.Task.ChildNodes |其中对象{$Delete

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

为了做到这一点,我使用了从

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

$Output=“C:\Users\Desktop\resultset.xml”
#加载现有文档
$Doc=[xml](获取内容-路径C:\Users\Desktop\test.xml)
#指定要删除的标记名,然后查找它们
$DeleteNames=“body”
($Doc.Task.ChildNodes |其中对象{$DeleteNames-包含$512;.Name})ForEach对象{
#从其父节点中删除每个节点
[void]$\u.ParentNode.RemoveChild($\u)
}
#保存修改后的文档
$Doc.Save($Output)
我使用以下示例XML文件:

a
B
300
5000
罐子
先生
5000
XML文件的目标是删除多个标记,如“Price”和“Total”或“Price”、“Title”、“Total”

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


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

在不深入讨论的情况下,我认为问题可能是您没有操作
$Doc
元素本身。我会直接在其上使用XML方法
SelectNodes

$Doc.ChildNodes.SelectNodes($DeleteNames) | Foreach-Object {
    $Doc.ChildNodes.RemoveChild($_)
}
$Doc.Save($Output)
更新: 如果
$DeleteNames
包含多个条件/节点,则需要将其设置为数组,并为每个条件/节点调用一次代码(SelectNodes不支持模式):

我想您可以使用XPath等进行备用节点选择,但我还没有对此进行深入研究。

这非常有效

$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)
$Output=“resultset.xml”
$Doc=[xml]“bbla”
$DeleteNames=“body”
$Doc.Task.ChildNodes |其中对象{$DeleteNames-eq$\.Name}| ForEach对象{
$\.ParentNode.RemoveChild($\)| Out Null
}
$Doc.Save($Output)

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

新代码非常有效,但我现在有另一个问题。问题是,当我尝试删除两个标记(如and或)时,它不起作用。要使用上面的代码实现这一点,您需要将
$DeleteNames
设置为一个数组,并相应地调用它。现在添加了它。我尝试更改代码,但现在出现以下错误:*“方法调用失败,因为[System.Xml.XmlElement]不包含名为“SelectNode”的方法。在C:\Users\EX27740\Desktop\Eric 3 verwijderen meerdere rijen.ps1:9 char:5”**我使用以下代码:*$Doc=[Xml](获取内容-路径C:\Users\EX27740\Desktop\TestEric.xml)#指定要删除的标记名$DeleteNames=,“body”,“Price”,“Total”| Foreach对象{$Doc.ChildNodes.SelectNode($)}Foreach对象{$Doc.ChildNodes.RemoveChild($DeleteNames)}$Doc.Save($Output)**对不起,上面的
SelectNode
应该是
SelectNodes
。现在已修复。
$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)