複数のxmlファイルから要素を追加および削除しようとしています。 2つの問題が発生しました。それは空の要素を自動的に削除し、次に私が望んでいたものを削除しませんでした
私はこのような私の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>
私が欲しいのは
<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>
上記の出力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>
空のノードが削除されたくない場合は削除され、newItemtoAddが追加されて正常になり、itemToRemoveノードが削除されなかった場合は削除されません
これが私のスクリプトです
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)
}
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
}
ディレクトリ内のすべての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"
}
注:「local-name」構文は名前空間を無視するためのものです。