xml 使用 Powershell 添加和删除 Xmlnode
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23939930/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Adding and Removing Xmlnode using Powershell
提问by Justin Homes
I am trying to add and remove elements from multiple xml files. i ran into two issue. it removed empty elements automatically and second it did not remove what i wanted to
我正在尝试从多个 xml 文件中添加和删除元素。我遇到了两个问题。它自动删除了空元素,其次它没有删除我想要的
I have my xml like this
我有这样的 xml
<Entity>
<App>
<item1>1</item1>
<emptyItem/>
<person>
<itemToRemove>true</itemToRemove>
<emptyItem/>
<otheritem>1</otheritem>
</person>
<person>
<itemToRemove>false</itemToRemove>
<emptyItem/>
<otheritem>3</otheritem>
</person>
<person>
<itemToRemove>false</itemToRemove>
<emptyItem/>
<otheritem>3</otheritem>
</person>
</App>
</Entity>
what i want is
我想要的是
<Entity>
<App>
<item1>1</item1>
<emptyItem/>
<person>
<emptyItem/>
<otheritem>1</otheritem>
</person>
<person>
<emptyItem/>
<otheritem>3</otheritem>
</person>
<person>
<emptyItem/>
<otheritem>3</otheritem>
</person>
<newItemtoAdd>2001-01-01</newItemtoAdd>
</App>
</Entity>
i added newItemtoAdd element and removed itemToRemove on output xml above.
我在上面的输出 xml 中添加了 newItemtoAdd 元素并删除了 itemToRemove 。
with the current script i have used what i get is this
<Entity>
<App>
<item1>1</item1>
<emptyItem/>
<person>
<itemToRemove>true</itemToRemove>
<otheritem>1</otheritem>
</person>
<person>
<itemToRemove>false</itemToRemove>
<otheritem>3</otheritem>
</person>
<person>
<itemToRemove>false</itemToRemove>
<otheritem>3</otheritem>
</person>
<newItemtoAdd>2001-01-01</newItemtoAdd>
</App>
</Entity>
emptyItem node is removed which i do not want to happen, newItemtoAdd is added which is good, and itemToRemove node is not removed which is not what i want
删除了我不想发生的 emptyItem 节点,添加了 newItemtoAdd 这很好,并且没有删除 itemToRemove 节点,这不是我想要的
here is my script
这是我的脚本
Get-ChildItem D:\Projects\*.xml |
% {
[xml]$xml = [xml](Get-Content $_.fullname)
$newItemtoAdd = $xml.CreateElement('newItemtoAdd')
$newItemtoAdd.PsBase.InnerText = '1900-01-01'
$null = $xml.Entity.App.AppendChild($newItemtoAdd)
$xml.SelectNodes("//Entity/App/person") | ? {
$_.name -eq "itemToRemove" } | % {$_.ParentNode.RemoveChildNode($_) }
$xml.Save($_.FullName)
}
回答by Alexander Obersht
Get-ChildItem D:\Projects\*.xml | % {
[Xml]$xml = Get-Content $_.FullName
$newItemtoAdd = $xml.CreateElement('newItemtoAdd')
$newItemtoAdd.PsBase.InnerText = '1900-01-01'
$xml.Entity.App.AppendChild($newItemtoAdd) | Out-Null
$parent_xpath = '/Entity/App/person'
$nodes = $xml.SelectNodes($parent_xpath)
$nodes | % {
$child_node = $_.SelectSingleNode('itemToRemove')
$_.RemoveChild($child_node) | Out-Null
}
$xml.OuterXml | Out-File $_.FullName
}
回答by cederlof
To remove a node from all xml-files in a directory, and save result as a new xml-file, I use this powershell-script:
要从目录中的所有 xml 文件中删除节点,并将结果保存为新的 xml 文件,我使用以下 powershell 脚本:
Get-ChildItem .\*.xml | % {
[Xml]$xml = Get-Content $_.FullName
$xml | Select-Xml -XPath '//*[local-name() = ''itemToRemove'']' | ForEach-Object{$_.Node.ParentNode.RemoveChild($_.Node)}
$xml.OuterXml | Out-File .\result.xml -encoding "UTF8"
}
Note: the "local-name"-syntax is for ignoring namespaces.
注意:“local-name”-语法用于忽略命名空间。

