Modification des données d'une balise dans un fichier XML à l'aide du fichier Windows batch
j'ai un fichier XML avec plusieurs balises, et je suis en train de changer le contenu d'une de ces balises avec un script batch.
un exemple du fichier xml est:
<ConfigurationData>
<ReportsFolder>Reports</ReportsFolder>
<Helpfolder>Help</HelpFolder>
<InstallationType>Terminal</InstallationType>
<LicenseFolder>..License</LicenseFolder>
</ConfigurationData>
j'essaie de changer les données entre <InstallationType>
et </InstallationType>
à une autre variable de mon choix. Je pense que j'aurais besoin d'une sorte de boucle for Pour trouver la partie du fichier xml, mais je suis perdu comment je voudrais modifier une seule section.
3 réponses
vous devriez vraiment utiliser un outil qui est conçu spécifiquement pour manipuler XML.
mais dans une pincée, vous pourriez utiliser n'importe quel outil qui peut faire une recherche regex et remplacer pour faire une solution naïve qui fonctionnerait avec le fichier comme vous l'avez prévu, mais pourrait échouer avec un fichier XML logiquement équivalent qui a eu la disposition physique réarrangé.
j'aime utiliser un utilitaire JScript/batch hybride que j'ai écrit appelé REPL.MTD à manipulez les fichiers texte via des scripts de traitement par lots. Le script s'exécute sur N'importe quelle machine Windows native à partir de XP, et il ne nécessite pas l'installation d'exécutables tiers. Cliquez sur le lien pour obtenir le code du script et une description plus détaillée.
utilisant REPL.BAT, une solution rapide et efficace mais naïve est aussi simple que:
setlocal enableDelayedExpansion
set "newValue=myNewValue"
type "fileName.xml"|repl "(<InstallationType>).*(</InstallationType>)" "!newValue!" >fileName.xml.new
move /y "fileName.xml.new" "fileName.xml"
@echo off
setlocal EnableDelayedExpansion
set anotherVariable=New value
(for /F "delims=" %%a in (theFile.xml) do (
set "line=%%a"
set "newLine=!line:InstallationType>=!"
if "!newLine!" neq "!line!" (
set "newLine=<InstallationType>%anotherVariable%</InstallationType>"
)
echo !newLine!
)) > newFile.xml
sortie avec votre exemple de données:
<ConfigurationData>
<ReportsFolder>\Reports</ReportsFolder>
<Helpfolder>\Help</HelpFolder>
<InstallationType>New value</InstallationType>
<LicenseFolder>..\License</LicenseFolder>
</ConfigurationData>
GNU sed
sed "/InstallationType/s/>[^<]*</>New Value</" file.xml
..sortie:
<ConfigurationData>
<ReportsFolder>\Reports</ReportsFolder>
<Helpfolder>\Help</HelpFolder>
<InstallationType>New Value</InstallationType>
<LicenseFolder>..\License</LicenseFolder>
</ConfigurationData>