2010-08-19 3 views
0

Je voudrais savoir quel est le script le plus court que l'on puisse écrire pour remplacer un élément XML dans un fichier par un autre d'un second fichier.Remplacement d'un élément XML par un autre

Je peux créer un programme simple pour le faire facilement, mais je me demande si c'est faisable facilement en utilisant un script shell. C'est juste un outil utilitaire conçu comme une commodité. Est-ce que cela peut être fait en utilisant sed? awk? Je ne suis pas familier avec ceux-là. Je suppose que je peux probablement le faire avec une combinaison de grep et wc, mais il semble probable qu'il existe une façon beaucoup plus directe de le faire.

Essentiellement, j'ai un gros fichier de configuration, par exemple config.xml, qui disent ressemble à ceci:

<config> 
    <element name="a"> 
     <subelement /> 
    </element> 
    <element name="b"> 
     <subelement /> 
    </element> 
    <element name="c"> 
     <subelement /> 
    </element> 
    <!-- and so on... --> 
</config> 

Une fois dans un certain temps, les changements me obligent à modifier/ajouter/supprimer un subelement. Maintenant, il se trouve qu'il ya une sorte de générateur qui va générer une mise à jour subconfig.xml, comme fichier suivant:

<config> 
    <element name="c"> 
     <subelement /> 
     <subelement /> 
    </element> 
</config> 

Ma pensée est que si je peux prendre la element en subconfig.xml et remplacer l'existant dans config.xml, alors bon, ce serait génial! Oui, ce n'est pas vraiment une économie de travail, car c'est rarement nécessaire, mais j'ai pensé que je pourrais essayer de le faire dans un script, mais je ne sais pas comment.

Toute aide appréciée (y compris souligner que je ferais mieux d'écrire un programme pour cela^- ^).

Répondre

1

Si votre xml est cohérent et que votre besoin de remplacement est simple, il n'est pas nécessaire d'utiliser des analyseurs syntaxiques. Tout simplement awk fera

$ subconfig=(<subconfig.xml) 
$ awk -v subconf=$subconfig '/<config>/{print subconf}/<config>/,/<\/config>/{next}1' config.xml 
+0

J'ai fini par utiliser une combinaison de awk pour obtenir les numéros de ligne, puis je l'ai manipulé en utilisant la tête et la queue. Le script que vous avez fourni ne fonctionnait pas dans shell, alors j'ai continué à jouer avec jusqu'à ce que je l'ai fait fonctionner. Merci quand même :) – aberrant80

1

Je ne tenterais pas de le faire avec les outils de ligne de commande, vous rencontrerez toutes sortes de difficultés. La façon dont vous devriez faire ceci est avec un analyseur XML approprié. La logique serait: consommer le fichier original, l'analyser, consommer le fichier de mise à jour, l'analyser, identifier le noeud que ce type doit remplacer, faire le remplacement, écrire le résultat. Je ne sais pas ce que vous êtes à l'aise avec le codage, mais il existe des parseurs XML disponibles dans la plupart des langages populaires.

+0

Ouais, je sais que ça fait facilement avec une bibliothèque XML, mais je suis juste l'utiliser comme un script de convenance personnelle, donc je ne veux pas vous embêter avec une application :) – aberrant80

Questions connexes