J'essaie d'ajouter et de supprimer des éléments de plusieurs fichiers xml. j'ai rencontré deux problèmes. il a supprimé automatiquement les éléments vides et deuxièmement, il n'a pas supprimé ce que je voulais
J'ai mon xml comme ça
<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>
ce que je veux c'est
<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>
j'ai ajouté l'élément newItemtoAdd et supprimé itemToRemove sur le xml de sortie ci-dessus.
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>
le nœud emptyItem est supprimé, ce que je ne veux pas, newItemtoAdd est ajouté, ce qui est bon, et le nœud itemToRemove n'est pas supprimé, ce qui n'est pas ce que je veux
voici mon 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)
}
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
}
Pour supprimer un nœud de tous les fichiers xml dans un répertoire et enregistrer le résultat en tant que nouveau fichier xml, j'utilise ce script 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"
}
Remarque: la syntaxe "nom-local" sert à ignorer les espaces de noms.